From: Alessandro Boch Date: Thu, 5 Dec 2013 07:22:12 +0000 (-0800) Subject: Bug 78 Enable Enqueue action in static flows X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~255^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=15defcf4ff0b34a176fe8444735ed56796473280 Bug 78 Enable Enqueue action in static flows Change-Id: I9e1558719a4d6e407e90a40c263380b4fac63f8f Signed-off-by: Alessandro Boch --- diff --git a/opendaylight/forwardingrulesmanager/api/pom.xml b/opendaylight/forwardingrulesmanager/api/pom.xml index f25756cc11..499b98c28a 100644 --- a/opendaylight/forwardingrulesmanager/api/pom.xml +++ b/opendaylight/forwardingrulesmanager/api/pom.xml @@ -87,7 +87,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java index 43b0252df7..de7597730f 100644 --- a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java +++ b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java @@ -13,7 +13,6 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.util.ArrayList; import java.util.List; -import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -26,6 +25,7 @@ import org.opendaylight.controller.sal.action.Action; import org.opendaylight.controller.sal.action.ActionType; import org.opendaylight.controller.sal.action.Controller; import org.opendaylight.controller.sal.action.Drop; +import org.opendaylight.controller.sal.action.Enqueue; import org.opendaylight.controller.sal.action.Flood; import org.opendaylight.controller.sal.action.HwPath; import org.opendaylight.controller.sal.action.Loopback; @@ -609,25 +609,13 @@ public class FlowConfig implements Serializable { return true; } - public boolean isPortValid(Switch sw, Short port) { - if (port < 1) { - log.debug("port {} is not valid", port); - return false; - } - + public boolean isPortValid(Switch sw, String port) { if (sw == null) { log.debug("switch info is not available. Skip checking if port is part of a switch or not."); return true; } - - Set nodeConnectorSet = sw.getNodeConnectors(); - for (NodeConnector nodeConnector : nodeConnectorSet) { - if (((Short) nodeConnector.getID()).equals(port)) { - return true; - } - } - log.debug("port {} is not a valid port of node {}", port, sw.getNode()); - return false; + NodeConnector nc = NodeConnectorCreator.createNodeConnector(port, sw.getNode()); + return sw.getNodeConnectors().contains(nc); } public boolean isVlanIdValid(String vlanId) { @@ -735,9 +723,8 @@ public class FlowConfig implements Serializable { } if (ingressPort != null) { - Short port = Short.decode(ingressPort); - if (isPortValid(sw, port) == false) { - String msg = String.format("Ingress port %d is not valid for the Switch", port); + if (!isPortValid(sw, ingressPort)) { + String msg = String.format("Ingress port %s is not valid for the Switch", ingressPort); if (!containerName.equals(GlobalConstants.DEFAULT.toString())) { msg += " in Container " + containerName; } @@ -850,10 +837,33 @@ public class FlowConfig implements Serializable { if (sstr.matches()) { for (String t : sstr.group(1).split(",")) { Matcher n = Pattern.compile("(?:(\\d+))").matcher(t); + if (n.matches()) { + String port = n.group(1); + if (port != null) { + if (!isPortValid(sw, port)) { + String msg = String.format("Output port %s is not valid for this switch", port); + if (!containerName.equals(GlobalConstants.DEFAULT.toString())) { + msg += " in Container " + containerName; + } + return new Status(StatusCode.BADREQUEST, msg); + } + } + } else { + String msg = String.format("Output port %s is not valid", t); + return new Status(StatusCode.BADREQUEST, msg); + } + } + continue; + } + // check enqueue + sstr = Pattern.compile("ENQUEUE=(.*)").matcher(actiongrp); + if (sstr.matches()) { + for (String t : sstr.group(1).split(",")) { + Matcher n = Pattern.compile("(?:(\\d+:\\d+))").matcher(t); if (n.matches()) { if (n.group(1) != null) { - Short port = Short.parseShort(n.group(1)); - if (isPortValid(sw, port) == false) { + String port = n.group(1).split(":")[0]; + if (!isPortValid(sw, port)) { String msg = String.format("Output port %d is not valid for this switch", port); if (!containerName.equals(GlobalConstants.DEFAULT.toString())) { msg += " in Container " + containerName; @@ -862,7 +872,7 @@ public class FlowConfig implements Serializable { } } } else { - String msg = String.format("Output port %s is not valid", t); + String msg = String.format("Enqueue port %s is not valid", t); return new Status(StatusCode.BADREQUEST, msg); } } @@ -990,7 +1000,7 @@ public class FlowConfig implements Serializable { if (this.ingressPort != null) { match.setField(MatchType.IN_PORT, - NodeConnectorCreator.createOFNodeConnector(Short.parseShort(ingressPort), getNode())); + NodeConnector.fromString(String.format("%s|%s@%s", node.getType(), ingressPort, node.toString()))); } if (this.dlSrc != null) { match.setField(MatchType.DL_SRC, HexEncode.bytesFromHexString(this.dlSrc)); @@ -1095,9 +1105,28 @@ public class FlowConfig implements Serializable { Matcher n = Pattern.compile("(?:(\\d+))").matcher(t); if (n.matches()) { if (n.group(1) != null) { - short ofPort = Short.parseShort(n.group(1)); - actionList.add(new Output(NodeConnectorCreator.createOFNodeConnector(ofPort, - this.getNode()))); + String nc = String.format("%s|%s@%s", node.getType(), n.group(1), node.toString()); + actionList.add(new Output(NodeConnector.fromString(nc))); + } + } + } + continue; + } + + sstr = Pattern.compile(ActionType.ENQUEUE + "=(.*)").matcher(actiongrp); + if (sstr.matches()) { + for (String t : sstr.group(1).split(",")) { + Matcher n = Pattern.compile("(?:(\\d+:\\d+))").matcher(t); + if (n.matches()) { + if (n.group(1) != null) { + String parts[] = n.group(1).split(":"); + String nc = String.format("%s|%s@%s", node.getType(), parts[0], node.toString()); + if (parts.length == 1) { + actionList.add(new Enqueue(NodeConnector.fromString(nc))); + } else { + actionList + .add(new Enqueue(NodeConnector.fromString(nc), Integer.parseInt(parts[1]))); + } } } } diff --git a/opendaylight/forwardingrulesmanager/api/src/test/java/org/opendaylight/controller/forwardingrulesmanager/frmTest.java b/opendaylight/forwardingrulesmanager/api/src/test/java/org/opendaylight/controller/forwardingrulesmanager/frmTest.java index 406970711c..48e1f07716 100644 --- a/opendaylight/forwardingrulesmanager/api/src/test/java/org/opendaylight/controller/forwardingrulesmanager/frmTest.java +++ b/opendaylight/forwardingrulesmanager/api/src/test/java/org/opendaylight/controller/forwardingrulesmanager/frmTest.java @@ -546,11 +546,6 @@ public class frmTest { fc.setCookie("100"); Assert.assertTrue(fc.validate(null).isSuccess()); - fc.setIngressPort("-1"); - status = fc.validate(null); - Assert.assertFalse(status.isSuccess()); - Assert.assertTrue(status.getDescription().contains("is not valid for the Switch")); - fc.setIngressPort("100"); Assert.assertTrue(fc.validate(null).isSuccess()); diff --git a/opendaylight/forwardingrulesmanager/implementation/pom.xml b/opendaylight/forwardingrulesmanager/implementation/pom.xml index 23c36a3752..6b3f5347ad 100644 --- a/opendaylight/forwardingrulesmanager/implementation/pom.xml +++ b/opendaylight/forwardingrulesmanager/implementation/pom.xml @@ -93,7 +93,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/northbound/flowprogrammer/pom.xml b/opendaylight/northbound/flowprogrammer/pom.xml index af2c18a217..1b81ccb450 100644 --- a/opendaylight/northbound/flowprogrammer/pom.xml +++ b/opendaylight/northbound/flowprogrammer/pom.xml @@ -88,7 +88,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.codehaus.enunciate diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java index 8fa4941b88..361f977b2c 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java @@ -57,6 +57,7 @@ import org.openflow.protocol.action.OFAction; import org.openflow.protocol.action.OFActionDataLayer; import org.openflow.protocol.action.OFActionDataLayerDestination; import org.openflow.protocol.action.OFActionDataLayerSource; +import org.openflow.protocol.action.OFActionEnqueue; import org.openflow.protocol.action.OFActionNetworkLayerAddress; import org.openflow.protocol.action.OFActionNetworkLayerDestination; import org.openflow.protocol.action.OFActionNetworkLayerSource; @@ -280,6 +281,15 @@ public class FlowConverter { actionsLength += OFActionOutput.MINIMUM_LENGTH; continue; } + if (action.getType() == ActionType.ENQUEUE) { + Enqueue a = (Enqueue) action; + OFActionEnqueue ofAction = new OFActionEnqueue(); + ofAction.setPort(PortConverter.toOFPort(a.getPort())); + ofAction.setQueueId(a.getQueue()); + actionsList.add(ofAction); + actionsLength += OFActionEnqueue.MINIMUM_LENGTH; + continue; + } if (action.getType() == ActionType.DROP) { continue; } @@ -683,6 +693,10 @@ public class FlowConverter { NodeConnectorCreator.createOFNodeConnector( ofPort, node)); } + } else if (ofAction instanceof OFActionEnqueue) { + salAction = new Enqueue(NodeConnectorCreator.createOFNodeConnector( + ((OFActionEnqueue) ofAction).getPort(), node), + ((OFActionEnqueue) ofAction).getQueueId()); } else if (ofAction instanceof OFActionVirtualLanIdentifier) { salAction = new SetVlanId( ((OFActionVirtualLanIdentifier) ofAction) diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Enqueue.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Enqueue.java index b3891c8337..c711e67f9e 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Enqueue.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Enqueue.java @@ -21,6 +21,8 @@ public class Enqueue extends Action { private static final long serialVersionUID = 1L; @XmlElement private NodeConnector port; + @XmlElement + private int queue; /* Dummy constructor for JAXB */ @SuppressWarnings("unused") @@ -30,9 +32,25 @@ public class Enqueue extends Action { public Enqueue(NodeConnector port) { type = ActionType.ENQUEUE; this.port = port; + this.queue = 0; + } + + public Enqueue(NodeConnector port, int queue) { + type = ActionType.ENQUEUE; + this.port = port; + this.queue = queue; } public NodeConnector getPort() { return port; } + + public int getQueue() { + return queue; + } + + @Override + public String toString() { + return String.format("%s[%s:%s]", type, port, queue); + } } diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/NodeConnectorCreator.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/NodeConnectorCreator.java index cbf3f95b2a..da4cd53883 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/NodeConnectorCreator.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/utils/NodeConnectorCreator.java @@ -40,7 +40,7 @@ public abstract class NodeConnectorCreator { if (node.getType().equals(NodeIDType.OPENFLOW)) { try { return new NodeConnector(NodeConnectorIDType.OPENFLOW, - (Short) portId, node); + portId, node); } catch (ConstructionException e1) { logger.error("",e1); return null; @@ -49,6 +49,18 @@ public abstract class NodeConnectorCreator { return null; } + /** + * Generic NodeConnector creator + * The nodeConnector type is inferred from the node type + * + * @param portId The string representing the port id + * @param node The network node as {@link org.opendaylight.controller.sal.core.Node Node} object + * @return The corresponding {@link org.opendaylight.controller.sal.core.NodeConnector NodeConnector} object + */ + public static NodeConnector createNodeConnector(String portId, Node node) { + return NodeConnector.fromString(String.format("%s|%s@%s", node.getType(), portId, node.toString())); + } + /** * NodeConnector creator where NodeConnector type can be specified * Needed to create special internal node connectors (like software stack)