From: Alessandro Boch Date: Wed, 21 Aug 2013 23:09:20 +0000 (+0000) Subject: Merge "Frm to install/uninstall flow when port is added/removed from slice" X-Git-Tag: releasepom-0.1.0~191 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=c8e2c38b1cdcb36b5db26f732532e43f1d9e2d6d;hp=657fba231b93d07740e5913907ad402598deeb69 Merge "Frm to install/uninstall flow when port is added/removed from slice" --- 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 5db7d32745..0304af493d 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 @@ -72,7 +72,7 @@ public class FlowConfig implements Serializable { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(FlowConfig.class); private static final String NAMEREGEX = "^[a-zA-Z0-9]+$"; - private static final String STATICFLOWGROUP = "__StaticFlows__"; + public static final String STATICFLOWGROUP = "__StaticFlows__"; public static final String INTERNALSTATICFLOWGROUP = "__InternalStaticFlows__"; public static final String INTERNALSTATICFLOWBEGIN = "__"; public static final String INTERNALSTATICFLOWEND = "__"; diff --git a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java index 57f3e8eb36..19b045b217 100644 --- a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java +++ b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManager.java @@ -91,6 +91,7 @@ public class ForwardingRulesManager implements IForwardingRulesManager, PortGrou private static final String NODEDOWN = "Node is Down"; private static final String SUCCESS = StatusCode.SUCCESS.toString(); private static final Logger log = LoggerFactory.getLogger(ForwardingRulesManager.class); + private static final String PORTREMOVED = "Port removed"; private String frmFileName; private String portGroupFileName; private ConcurrentMap staticFlows; @@ -1926,6 +1927,32 @@ public class ForwardingRulesManager implements IForwardingRulesManager, PortGrou } } + private boolean doesFlowContainNodeConnector(Flow flow, NodeConnector nc) { + if (nc == null) { + return false; + } + + Match match = flow.getMatch(); + if (match.isPresent(MatchType.IN_PORT)) { + NodeConnector matchPort = (NodeConnector) match.getField(MatchType.IN_PORT).getValue(); + if (matchPort.equals(nc)) { + return true; + } + } + List actionsList = flow.getActions(); + if (actionsList != null) { + for (Action action : actionsList) { + if (action instanceof Output) { + NodeConnector actionPort = ((Output) action).getPort(); + if (actionPort.equals(nc)) { + return true; + } + } + } + } + return false; + } + @Override public void notifyNode(Node node, UpdateType type, Map propMap) { this.pendingEvents.offer(new NodeUpdateEvent(type, node)); @@ -2269,10 +2296,66 @@ public class ForwardingRulesManager implements IForwardingRulesManager, PortGrou } @Override - public void nodeConnectorUpdated(String containerName, NodeConnector p, UpdateType t) { + public void nodeConnectorUpdated(String containerName, NodeConnector nc, UpdateType t) { if (!container.getName().equals(containerName)) { return; } + + boolean updateStaticFlowCluster = false; + + switch (t) { + case REMOVED: + + List nodeFlowEntries = nodeFlows.get(nc.getNode()); + if (nodeFlowEntries == null) { + return; + } + for (FlowEntryInstall fei : new ArrayList(nodeFlowEntries)) { + if (doesFlowContainNodeConnector(fei.getInstall().getFlow(), nc)) { + Status status = this.removeEntryInternal(fei, true); + if (!status.isSuccess()) { + continue; + } + /* + * If the flow entry is a static flow, then update its + * configuration + */ + if (fei.getGroupName().equals(FlowConfig.STATICFLOWGROUP)) { + FlowConfig flowConfig = getStaticFlow(fei.getFlowName(), fei.getNode()); + if (flowConfig != null) { + flowConfig.setStatus(PORTREMOVED); + updateStaticFlowCluster = true; + } + } + } + } + if (updateStaticFlowCluster) { + refreshClusterStaticFlowsStatus(nc.getNode()); + } + break; + case ADDED: + List flowConfigForNode = getStaticFlows(nc.getNode()); + for (FlowConfig flowConfig : flowConfigForNode) { + if (doesFlowContainNodeConnector(flowConfig.getFlow(), nc)) { + if (flowConfig.installInHw()) { + Status status = this.installFlowEntry(flowConfig.getFlowEntry()); + if (!status.isSuccess()) { + flowConfig.setStatus(status.getDescription()); + } else { + flowConfig.setStatus(SUCCESS); + } + updateStaticFlowCluster = true; + } + } + } + if (updateStaticFlowCluster) { + refreshClusterStaticFlowsStatus(nc.getNode()); + } + break; + case CHANGED: + break; + default: + } } @Override