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;
import org.opendaylight.controller.northbound.commons.exception.InternalServerErrorException;
import org.opendaylight.controller.northbound.commons.exception.MethodNotAllowedException;
import org.opendaylight.controller.northbound.commons.exception.NotAcceptableException;
-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.northbound.commons.exception.UnauthorizedException;
import org.opendaylight.controller.switchmanager.ISwitchManager;
/**
- * Flow Configuration Northbound API
+ * Flow Configuration Northbound API provides capabilities to program flows.
*
* <br>
* <br>
* Authentication realm : <b>opendaylight</b><br>
* Transport : <b>HTTP and HTTPS</b><br>
* <br>
- * HTTPS Authentication is disabled by default. Administrator can enable it in
- * tomcat-server.xml after adding a proper keystore / SSL certificate from a
- * trusted authority.<br>
- * More info :
- * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
+ * HTTPS Authentication is disabled by default.
*
*/
@Path("/")
@Context
public void setSecurityContext(SecurityContext context) {
- if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName();
+ if (context != null && context.getUserPrincipal() != null) {
+ username = context.getUserPrincipal().getName();
+ }
}
protected String getUserName() {
return username;
}
- private IForwardingRulesManager getForwardingRulesManagerService(
- String containerName) {
- IContainerManager containerManager = (IContainerManager) ServiceHelper
- .getGlobalInstance(IContainerManager.class, this);
+ private IForwardingRulesManager getForwardingRulesManagerService(String containerName) {
+ IContainerManager containerManager = (IContainerManager) ServiceHelper.getGlobalInstance(
+ IContainerManager.class, this);
if (containerManager == null) {
- throw new ServiceUnavailableException("Container "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Container " + RestMessages.SERVICEUNAVAILABLE.toString());
}
boolean found = false;
}
if (found == false) {
- throw new ResourceNotFoundException(containerName + " "
- + RestMessages.NOCONTAINER.toString());
+ throw new ResourceNotFoundException(containerName + " " + RestMessages.NOCONTAINER.toString());
}
- IForwardingRulesManager frm = (IForwardingRulesManager) ServiceHelper
- .getInstance(IForwardingRulesManager.class, containerName, this);
+ IForwardingRulesManager frm = (IForwardingRulesManager) ServiceHelper.getInstance(
+ IForwardingRulesManager.class, containerName, this);
if (frm == null) {
- throw new ServiceUnavailableException("Flow Programmer "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Flow Programmer " + RestMessages.SERVICEUNAVAILABLE.toString());
}
return frm;
}
- private List<FlowConfig> getStaticFlowsInternal(String containerName,
- Node node) {
+ private List<FlowConfig> getStaticFlowsInternal(String containerName, Node node) {
IForwardingRulesManager frm = getForwardingRulesManagerService(containerName);
if (frm == null) {
- throw new ServiceUnavailableException("Flow Programmer "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Flow Programmer " + RestMessages.SERVICEUNAVAILABLE.toString());
}
List<FlowConfig> flows = new ArrayList<FlowConfig>();
flows.add(flow);
}
} else {
- ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance(
- ISwitchManager.class, containerName, this);
+ ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this);
if (sm == null) {
- throw new ServiceUnavailableException("Switch Manager "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString());
}
if (!sm.getNodes().contains(node)) {
- throw new ResourceNotFoundException(node.toString() + " : "
- + RestMessages.NONODE.toString());
+ throw new ResourceNotFoundException(node.toString() + " : " + RestMessages.NONODE.toString());
}
for (FlowConfig flow : frm.getStaticFlows(node)) {
* Name of the Container (Eg. 'default')
* @return List of flows configured on a given container
*
- * <pre>
+ * <pre>
*
* Example:
*
- * RequestURL:
- * http://localhost:8080/controller/nb/v2/flow/default
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/flowprogrammer/default
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <list>
*    <flowConfig>
*    </flowConfig>
* </list>
*
- * Response in JSON:
- * {"flowConfig":{"installInHw":"true","name":"flow1","node":{"id":"00:00:00:00:00:00:00:01","type":"OF"},
- * "ingressPort":"1","priority":"500","etherType":"0x800","nwSrc":"9.9.1.1","actions":"OUTPUT=2"}}
- *
+ * Response body in JSON:
+ * {
+ * "flowConfig": [
+ * {
+ * "installInHw": "true",
+ * "name": "flow1",
+ * "node": {
+ * "type": "OF",
+ * "id": "00:00:00:00:00:00:00:01"
+ * },
+ * "ingressPort": "1",
+ * "priority": "500",
+ * "etherType": "0x800",
+ * "nwSrc":"9.9.1.1",
+ * "actions": [
+ * "OUTPUT=2"
+ * ]
+ * }
+ * ]
+ * }
* </pre>
*/
@Path("/{containerName}")
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@TypeHint(FlowConfigs.class)
- @StatusCodes({
- @ResponseCode(code = 200, condition = "Operation successful"),
- @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
- @ResponseCode(code = 404, condition = "The containerName is not found"),
- @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
- public FlowConfigs getStaticFlows(
- @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);
+ @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"),
+ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
+ @ResponseCode(code = 404, condition = "The containerName is not found"),
+ @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
+ public FlowConfigs getStaticFlows(@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);
}
- List<FlowConfig> flowConfigs = getStaticFlowsInternal(containerName,
- null);
+ List<FlowConfig> flowConfigs = getStaticFlowsInternal(containerName, null);
return new FlowConfigs(flowConfigs);
}
* Node Identifier (Eg. '00:00:00:00:00:00:00:01')
* @return List of flows configured on a Node in a container
*
- * <pre>
+ * <pre>
*
* Example:
*
- * RequestURL:
- * http://localhost:8080/controller/nb/v2/flow/default/node/OF/00:00:00:00:00:00:00:01
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/flowprogrammer/default/node/OF/00:00:00:00:00:00:00:01
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <list>
*    <flowConfig>
*    </flowConfig>
* </list>
*
- * Response in JSON:
- * {"flowConfig":{"installInHw":"true","name":"flow1","node":{"id":"00:00:00:00:00:00:00:01","type":"OF"},
- * "ingressPort":"1","priority":"500","etherType":"0x800","nwSrc":"9.9.1.1","actions":"OUTPUT=2"}}
- *
+ * Response body in JSON:
+ * {
+ * "flowConfig": [
+ * {
+ * "installInHw": "true",
+ * "name": "flow1",
+ * "node": {
+ * "type": "OF",
+ * "id": "00:00:00:00:00:00:00:01"
+ * },
+ * "ingressPort": "1",
+ * "priority": "500",
+ * "etherType": "0x800",
+ * "nwSrc":"9.9.1.1",
+ * "actions": [
+ * "OUTPUT=2"
+ * ]
+ * }
+ * ]
+ * }
* </pre>
*/
@Path("/{containerName}/node/{nodeType}/{nodeId}")
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@TypeHint(FlowConfigs.class)
- @StatusCodes({
- @ResponseCode(code = 200, condition = "Operation successful"),
- @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
- @ResponseCode(code = 404, condition = "The containerName or nodeId is not found"),
- @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
- public FlowConfigs getStaticFlows(
- @PathParam("containerName") String containerName,
- @PathParam("nodeType") String nodeType,
- @PathParam("nodeId") String nodeId) {
- if (!NorthboundUtils.isAuthorized(
- getUserName(), containerName, Privilege.READ, this)) {
- throw new UnauthorizedException(
- "User is not authorized to perform this operation on container "
- + containerName);
+ @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"),
+ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
+ @ResponseCode(code = 404, condition = "The containerName or nodeId is not found"),
+ @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
+ public FlowConfigs getStaticFlows(@PathParam("containerName") String containerName,
+ @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId) {
+ if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) {
+ throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ + containerName);
}
Node node = Node.fromString(nodeType, nodeId);
if (node == null) {
- throw new ResourceNotFoundException(nodeId + " : "
- + RestMessages.NONODE.toString());
+ throw new ResourceNotFoundException(nodeId + " : " + RestMessages.NONODE.toString());
}
List<FlowConfig> flows = getStaticFlowsInternal(containerName, node);
return new FlowConfigs(flows);
* Human-readable name for the configured flow (Eg. 'Flow1')
* @return Flow configuration matching the name and nodeId on a Container
*
- * <pre>
+ * <pre>
*
* Example:
*
- * RequestURL:
- * http://localhost:8080/controller/nb/v2/flow/default/node/OF/00:00:00:00:00:00:00:01/static-flow/flow1
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/flowprogrammer/default/node/OF/00:00:00:00:00:00:00:01/staticFlow/flow1
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <flowConfig>
*    <installInHw>true</installInHw>
*    <actions>OUTPUT=2</actions>
* </flowConfig>
*
- * Response in JSON:
- * {"installInHw":"true","name":"flow1","node":{"id":"00:00:00:00:00:00:00:01","type":"OF"},
- * "ingressPort":"1","priority":"500","etherType":"0x800","nwSrc":"9.9.1.1","actions":"OUTPUT=2"}
+ * Response body in JSON:
+ * {
+ * "installInHw":"true",
+ * "name":"flow1",
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
+ * },
+ * "ingressPort":"1",
+ * "priority":"500",
+ * "etherType":"0x800",
+ * "nwSrc":"9.9.1.1",
+ * "actions":[
+ * "OUTPUT=2"
+ * ]
+ * }
*
* </pre>
*/
- @Path("/{containerName}/node/{nodeType}/{nodeId}/static-flow/{name}")
+ @Path("/{containerName}/node/{nodeType}/{nodeId}/staticFlow/{name}")
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@TypeHint(FlowConfig.class)
- @StatusCodes({
- @ResponseCode(code = 200, condition = "Operation successful"),
- @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
- @ResponseCode(code = 404, condition = "The containerName or NodeId or Configuration name is not found"),
- @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
- public FlowConfig getStaticFlow(
- @PathParam("containerName") String containerName,
- @PathParam("nodeType") String nodeType,
- @PathParam("nodeId") String nodeId, @PathParam("name") String name) {
- if (!NorthboundUtils.isAuthorized(
- getUserName(), containerName, Privilege.READ, this)) {
- throw new UnauthorizedException(
- "User is not authorized to perform this operation on container "
- + containerName);
+ @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"),
+ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
+ @ResponseCode(code = 404, condition = "The containerName or NodeId or Configuration name is not found"),
+ @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
+ public FlowConfig getStaticFlow(@PathParam("containerName") String containerName,
+ @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, @PathParam("name") String name) {
+ if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) {
+ throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ + containerName);
}
IForwardingRulesManager frm = getForwardingRulesManagerService(containerName);
if (frm == null) {
- throw new ServiceUnavailableException("Flow Programmer "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Flow Programmer " + RestMessages.SERVICEUNAVAILABLE.toString());
}
Node node = handleNodeAvailability(containerName, nodeType, nodeId);
}
/**
- * Add a flow configuration
+ * Add or Modify a flow configuration. If the flow exists already, it will replace the current flow.
*
* @param containerName
* Name of the Container (Eg. 'default')
* Flow Configuration in JSON or XML format
* @return Response as dictated by the HTTP Response Status code
*
- * <pre>
+ * <pre>
*
* Example:
*
- * RequestURL:
- * http://localhost:8080/controller/nb/v2/flow/default/node/OF/00:00:00:00:00:00:00:01/static-flow/flow1
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/flowprogrammer/default/node/OF/00:00:00:00:00:00:00:01/staticFlow/flow1
*
- * Request in XML:
+ * Request body in XML:
* <flowConfig>
*    <installInHw>true</installInHw>
*    <name>flow1</name>
*    <actions>OUTPUT=2</actions>
* </flowConfig>
*
- * Request in JSON:
- * {"installInHw":"true","name":"flow1","node":{"id":"00:00:00:00:00:00:00:01","type":"OF"},
- * "ingressPort":"1","priority":"500","etherType":"0x800","nwSrc":"9.9.1.1","actions":"OUTPUT=2"}
- *
+ * Request body in JSON:
+ * {
+ * "installInHw":"true",
+ * "name":"flow1",
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:01",
+ * "type":"OF"
+ * },
+ * "ingressPort":"1",
+ * "priority":"500",
+ * "etherType":"0x800",
+ * "nwSrc":"9.9.1.1",
+ * "actions":[
+ * "OUTPUT=2"
+ * ]
+ * }
* </pre>
*/
- @Path("/{containerName}/node/{nodeType}/{nodeId}/static-flow/{name}")
+ @Path("/{containerName}/node/{nodeType}/{nodeId}/staticFlow/{name}")
@PUT
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes({
- @ResponseCode(code = 201, condition = "Flow Config processed successfully"),
- @ResponseCode(code = 400, condition = "Failed to create Static Flow entry due to invalid flow configuration"),
- @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
- @ResponseCode(code = 404, condition = "The Container Name or nodeId is not found"),
- @ResponseCode(code = 406, condition = "Cannot operate on Default Container when other Containers are active"),
- @ResponseCode(code = 409, condition = "Failed to create Static Flow entry due to Conflicting Name or configuration"),
- @ResponseCode(code = 500, condition = "Failed to create Static Flow entry. Failure Reason included in HTTP Error response"),
- @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") })
- public Response addFlow(
- @PathParam(value = "containerName") String containerName,
- @PathParam(value = "name") String name,
- @PathParam("nodeType") String nodeType,
- @PathParam(value = "nodeId") String nodeId,
- @TypeHint(FlowConfig.class) FlowConfig flowConfig) {
-
- if (!NorthboundUtils.isAuthorized(
- getUserName(), containerName, Privilege.WRITE, this)) {
- throw new UnauthorizedException(
- "User is not authorized to perform this operation on container "
- + containerName);
+ @ResponseCode(code = 200, condition = "Static Flow modified successfully"),
+ @ResponseCode(code = 201, condition = "Flow Config processed successfully"),
+ @ResponseCode(code = 400, condition = "Failed to create Static Flow entry due to invalid flow configuration"),
+ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
+ @ResponseCode(code = 404, condition = "The Container Name or nodeId is not found"),
+ @ResponseCode(code = 406, condition = "Cannot operate on Default Container when other Containers are active"),
+ @ResponseCode(code = 409, condition = "Failed to create Static Flow entry due to Conflicting Name or configuration"),
+ @ResponseCode(code = 500, condition = "Failed to create Static Flow entry. Failure Reason included in HTTP Error response"),
+ @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") })
+ public Response addOrModifyFlow(@PathParam(value = "containerName") String containerName,
+ @PathParam(value = "name") String name, @PathParam("nodeType") String nodeType,
+ @PathParam(value = "nodeId") String nodeId, @TypeHint(FlowConfig.class) FlowConfig flowConfig) {
+
+ if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) {
+ throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ + containerName);
}
if (flowConfig.getNode() == null) {
.build();
}
handleResourceCongruence(name, flowConfig.getName());
- handleResourceCongruence(nodeId, flowConfig.getNode().getNodeIDString());
+ handleResourceCongruence(nodeType, flowConfig.getNode().getType());
+ handleResourceCongruence(nodeId, flowConfig.getNode().getID() == null ? null : flowConfig.getNode().getNodeIDString());
handleDefaultDisabled(containerName);
IForwardingRulesManager frm = getForwardingRulesManagerService(containerName);
if (frm == null) {
- throw new ServiceUnavailableException("Flow Programmer "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Flow Programmer " + RestMessages.SERVICEUNAVAILABLE.toString());
}
Node node = handleNodeAvailability(containerName, nodeType, nodeId);
+ Status status;
FlowConfig staticFlow = frm.getStaticFlow(name, node);
- if (staticFlow != null) {
- throw new ResourceConflictException(name + " already exists."
- + RestMessages.RESOURCECONFLICT.toString());
- }
-
- Status status = frm.addStaticFlow(flowConfig);
- if (status.isSuccess()) {
- NorthboundUtils.auditlog("Flow", username, "added", name, containerName);
- return Response.status(Response.Status.CREATED).entity("Success").build();
+ if (staticFlow == null) {
+ status = frm.addStaticFlow(flowConfig);
+ if(status.isSuccess()){
+ NorthboundUtils.auditlog("Flow Entry", username, "added",
+ name + " on Node " + NorthboundUtils.getNodeDesc(node, containerName, this), containerName);
+ return Response.status(Response.Status.CREATED).entity("Success").build();
+ }
+ } else {
+ status = frm.modifyStaticFlow(flowConfig);
+ if(status.isSuccess()){
+ NorthboundUtils.auditlog("Flow Entry", username, "updated",
+ name + " on Node " + NorthboundUtils.getNodeDesc(node, containerName, this), containerName);
+ return NorthboundUtils.getResponse(status);
+ }
}
return NorthboundUtils.getResponse(status);
}
* Name of the Static Flow configuration (Eg. 'Flow1')
* @return Response as dictated by the HTTP Response code
*
- * <pre>
+ * <pre>
*
* Example:
*
* RequestURL:
- * http://localhost:8080/controller/nb/v2/flow/default/node/OF/00:00:00:00:00:00:00:01/static-flow/flow1
+ * http://localhost:8080/controller/nb/v2/flowprogrammer/default/node/OF/00:00:00:00:00:00:00:01/staticFlow/flow1
*
* </pre>
*/
- @Path("/{containerName}/node/{nodeType}/{nodeId}/static-flow/{name}")
+ @Path("/{containerName}/node/{nodeType}/{nodeId}/staticFlow/{name}")
@DELETE
- @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes({
- @ResponseCode(code = 200, condition = "Flow Config deleted successfully"),
- @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
- @ResponseCode(code = 404, condition = "The Container Name or Node-id or Flow Name passed is not found"),
- @ResponseCode(code = 406, condition = "Failed to delete Flow config due to invalid operation. Failure details included in HTTP Error response"),
- @ResponseCode(code = 500, condition = "Failed to delete Flow config. Failure Reason included in HTTP Error response"),
- @ResponseCode(code = 503, condition = "One or more of Controller service is unavailable") })
- public Response deleteFlow(
- @PathParam(value = "containerName") String containerName,
- @PathParam(value = "name") String name,
- @PathParam("nodeType") String nodeType,
+ @ResponseCode(code = 204, condition = "Flow Config deleted successfully"),
+ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
+ @ResponseCode(code = 404, condition = "The Container Name or Node-id or Flow Name passed is not found"),
+ @ResponseCode(code = 406, condition = "Failed to delete Flow config due to invalid operation. Failure details included in HTTP Error response"),
+ @ResponseCode(code = 500, condition = "Failed to delete Flow config. Failure Reason included in HTTP Error response"),
+ @ResponseCode(code = 503, condition = "One or more of Controller service is unavailable") })
+ public Response deleteFlow(@PathParam(value = "containerName") String containerName,
+ @PathParam(value = "name") String name, @PathParam("nodeType") String nodeType,
@PathParam(value = "nodeId") String nodeId) {
- 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);
}
handleDefaultDisabled(containerName);
IForwardingRulesManager frm = getForwardingRulesManagerService(containerName);
if (frm == null) {
- throw new ServiceUnavailableException("Flow Programmer "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Flow Programmer " + RestMessages.SERVICEUNAVAILABLE.toString());
}
Node node = handleNodeAvailability(containerName, nodeType, nodeId);
FlowConfig staticFlow = frm.getStaticFlow(name, node);
if (staticFlow == null) {
- throw new ResourceNotFoundException(name + " : "
- + RestMessages.NOFLOW.toString());
+ throw new ResourceNotFoundException(name + " : " + RestMessages.NOFLOW.toString());
}
Status status = frm.removeStaticFlow(name, node);
if (status.isSuccess()) {
- NorthboundUtils.auditlog("Flow", username, "removed", name, containerName);
+ NorthboundUtils.auditlog("Flow Entry", username, "removed",
+ name + " from Node " + NorthboundUtils.getNodeDesc(node, containerName, this), containerName);
+ return Response.noContent().build();
}
return NorthboundUtils.getResponse(status);
}
* Name of the Static Flow configuration (Eg. 'Flow1')
* @return Response as dictated by the HTTP Response code
*
- * <pre>
+ * <pre>
*
* Example:
*
* RequestURL:
- * http://localhost:8080/controller/nb/v2/flow/default/node/OF/00:00:00:00:00:00:00:01/static-flow/flow1
+ * http://localhost:8080/controller/nb/v2/flowprogrammer/default/node/OF/00:00:00:00:00:00:00:01/staticFlow/flow1
*
* </pre>
*/
- @Path("/{containerName}/node/{nodeType}/{nodeId}/static-flow/{name}")
+ @Path("/{containerName}/node/{nodeType}/{nodeId}/staticFlow/{name}")
@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes({
- @ResponseCode(code = 200, condition = "Flow Config processed successfully"),
- @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
- @ResponseCode(code = 404, condition = "The Container Name or Node-id or Flow Name passed is not found"),
- @ResponseCode(code = 406, condition = "Failed to delete Flow config due to invalid operation. Failure details included in HTTP Error response"),
- @ResponseCode(code = 500, condition = "Failed to delete Flow config. Failure Reason included in HTTP Error response"),
- @ResponseCode(code = 503, condition = "One or more of Controller service is unavailable") })
- public Response toggleFlow(
- @PathParam(value = "containerName") String containerName,
- @PathParam("nodeType") String nodeType,
- @PathParam(value = "nodeId") String nodeId,
+ @ResponseCode(code = 200, condition = "Flow Config processed successfully"),
+ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
+ @ResponseCode(code = 404, condition = "The Container Name or Node-id or Flow Name passed is not found"),
+ @ResponseCode(code = 406, condition = "Failed to delete Flow config due to invalid operation. Failure details included in HTTP Error response"),
+ @ResponseCode(code = 500, condition = "Failed to delete Flow config. Failure Reason included in HTTP Error response"),
+ @ResponseCode(code = 503, condition = "One or more of Controller service is unavailable") })
+ public Response toggleFlow(@PathParam(value = "containerName") String containerName,
+ @PathParam("nodeType") String nodeType, @PathParam(value = "nodeId") String nodeId,
@PathParam(value = "name") String name) {
- 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);
}
handleDefaultDisabled(containerName);
IForwardingRulesManager frm = getForwardingRulesManagerService(containerName);
if (frm == null) {
- throw new ServiceUnavailableException("Flow Programmer "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Flow Programmer " + RestMessages.SERVICEUNAVAILABLE.toString());
}
Node node = handleNodeAvailability(containerName, nodeType, nodeId);
FlowConfig staticFlow = frm.getStaticFlow(name, node);
if (staticFlow == null) {
- throw new ResourceNotFoundException(name + " : "
- + RestMessages.NOFLOW.toString());
+ throw new ResourceNotFoundException(name + " : " + RestMessages.NOFLOW.toString());
}
Status status = frm.toggleStaticFlowStatus(staticFlow);
if (status.isSuccess()) {
- NorthboundUtils.auditlog("Flow", username, "toggled", name, containerName);
+ NorthboundUtils.auditlog("Flow Entry", username, "toggled",
+ name + " on Node " + NorthboundUtils.getNodeDesc(node, containerName, this), containerName);
}
return NorthboundUtils.getResponse(status);
}
- private Node handleNodeAvailability(String containerName, String nodeType,
- String nodeId) {
+ private Node handleNodeAvailability(String containerName, String nodeType, String nodeId) {
Node node = Node.fromString(nodeType, nodeId);
if (node == null) {
- throw new ResourceNotFoundException(nodeId + " : "
- + RestMessages.NONODE.toString());
+ throw new ResourceNotFoundException(nodeId + " : " + RestMessages.NONODE.toString());
}
- ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance(
- ISwitchManager.class, containerName, this);
+ ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this);
if (sm == null) {
- throw new ServiceUnavailableException("Switch Manager "
- + RestMessages.SERVICEUNAVAILABLE.toString());
+ throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString());
}
if (!sm.getNodes().contains(node)) {
- throw new ResourceNotFoundException(node.toString() + " : "
- + RestMessages.NONODE.toString());
+ throw new ResourceNotFoundException(node.toString() + " : " + RestMessages.NONODE.toString());
}
return node;
}
private void handleDefaultDisabled(String containerName) {
- IContainerManager containerManager = (IContainerManager) ServiceHelper
- .getGlobalInstance(IContainerManager.class, this);
+ IContainerManager containerManager = (IContainerManager) ServiceHelper.getGlobalInstance(
+ IContainerManager.class, this);
if (containerManager == null) {
- throw new InternalServerErrorException(
- RestMessages.INTERNALERROR.toString());
+ throw new InternalServerErrorException(RestMessages.INTERNALERROR.toString());
}
- if (containerName.equals(GlobalConstants.DEFAULT.toString())
- && containerManager.hasNonDefaultContainer()) {
- throw new NotAcceptableException(
- RestMessages.DEFAULTDISABLED.toString());
+ if (containerName.equals(GlobalConstants.DEFAULT.toString()) && containerManager.hasNonDefaultContainer()) {
+ throw new NotAcceptableException(RestMessages.DEFAULTDISABLED.toString());
}
}