X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fforwardingrulesmanager%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fforwardingrulesmanager%2Finternal%2FForwardingRulesManager.java;h=520825762a40e8bfec9b89c5c0541c41edeedfc1;hp=defe9b4a82f6a9f8a2c9e48c94d54ec0d108568b;hb=6fa9558f9afe51ea0221a164d01d6099eb020763;hpb=4ee690b3242c151257286f31dcc45ea2d8ae81cb 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 defe9b4a82..520825762a 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 @@ -11,7 +11,6 @@ package org.opendaylight.controller.forwardingrulesmanager.internal; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; -import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; @@ -38,8 +37,8 @@ import org.opendaylight.controller.clustering.services.ICacheUpdateAware; import org.opendaylight.controller.clustering.services.IClusterContainerServices; import org.opendaylight.controller.clustering.services.IClusterServices; import org.opendaylight.controller.configuration.IConfigurationContainerAware; -import org.opendaylight.controller.sal.connection.ConnectionLocality; import org.opendaylight.controller.connectionmanager.IConnectionManager; +import org.opendaylight.controller.containermanager.IContainerManager; import org.opendaylight.controller.forwardingrulesmanager.FlowConfig; import org.opendaylight.controller.forwardingrulesmanager.FlowEntry; import org.opendaylight.controller.forwardingrulesmanager.FlowEntryInstall; @@ -52,14 +51,12 @@ import org.opendaylight.controller.forwardingrulesmanager.PortGroupProvider; import org.opendaylight.controller.forwardingrulesmanager.implementation.data.FlowEntryDistributionOrder; 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.Flood; import org.opendaylight.controller.sal.action.Output; -import org.opendaylight.controller.sal.action.PopVlan; +import org.opendaylight.controller.sal.connection.ConnectionLocality; import org.opendaylight.controller.sal.core.Config; import org.opendaylight.controller.sal.core.ContainerFlow; import org.opendaylight.controller.sal.core.IContainer; -import org.opendaylight.controller.sal.core.IContainerListener; +import org.opendaylight.controller.sal.core.IContainerLocalListener; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Property; @@ -71,10 +68,7 @@ import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchType; import org.opendaylight.controller.sal.utils.EtherTypes; import org.opendaylight.controller.sal.utils.GlobalConstants; -import org.opendaylight.controller.sal.utils.HexEncode; import org.opendaylight.controller.sal.utils.IObjectReader; -import org.opendaylight.controller.sal.utils.IPProtocols; -import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.NodeCreator; import org.opendaylight.controller.sal.utils.ObjectReader; import org.opendaylight.controller.sal.utils.ObjectWriter; @@ -97,7 +91,7 @@ import org.slf4j.LoggerFactory; public class ForwardingRulesManager implements IForwardingRulesManager, PortGroupChangeListener, - IContainerListener, + IContainerLocalListener, ISwitchManagerAware, IConfigurationContainerAware, IInventoryListener, @@ -105,11 +99,12 @@ public class ForwardingRulesManager implements ICacheUpdateAware, CommandProvider, IFlowProgrammerListener { - 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 static final Logger logsync = LoggerFactory.getLogger("FRMsync"); + private static final String PORTREMOVED = "Port removed"; + private static final String NODEDOWN = "Node is Down"; + private static final String INVALID_FLOW_ENTRY = "Invalid FlowEntry"; private String frmFileName; private String portGroupFileName; private ConcurrentMap staticFlows; @@ -117,8 +112,9 @@ public class ForwardingRulesManager implements private ConcurrentMap portGroupConfigs; private ConcurrentMap> portGroupData; private ConcurrentMap TSPolicies; + private IContainerManager containerManager; private boolean inContainerMode; // being used by global instance only - private boolean stopping; + protected boolean stopping; /* * Flow database. It's the software view of what was requested to install @@ -162,8 +158,8 @@ public class ForwardingRulesManager implements * necessity non-transactional as long as need to be able to synchronize * states also while a transaction is in progress */ - static final String WORKORDERCACHE = "frm.workOrder"; - static final String WORKSTATUSCACHE = "frm.workStatus"; + static final String WORK_ORDER_CACHE = "frm.workOrder"; + static final String WORK_STATUS_CACHE = "frm.workStatus"; /* * Data structure responsible for distributing the FlowEntryInstall requests @@ -180,7 +176,7 @@ public class ForwardingRulesManager implements * not picked by anyone, which is always a case can happen especially on * Node disconnect cases. */ - private ConcurrentMap workOrder; + protected ConcurrentMap workOrder; /* * Data structure responsible for retrieving the results of the workOrder @@ -193,7 +189,7 @@ public class ForwardingRulesManager implements * TODO: The workStatus entries need to have a lifetime associated in case * of requestor controller leaving the cluster. */ - private ConcurrentMap workStatus; + protected ConcurrentMap workStatus; /* * Local Map used to hold the Future which a caller can use to monitor for @@ -202,6 +198,11 @@ public class ForwardingRulesManager implements private ConcurrentMap workMonitor = new ConcurrentHashMap(); + /* + * Max pool size for the executor + */ + private static final int maxPoolSize = 10; + /** * @param e * Entry being installed/updated/removed @@ -261,11 +262,34 @@ public class ForwardingRulesManager implements private Status addEntry(FlowEntry flowEntry, boolean async) { // Sanity Check - if (flowEntry == null || flowEntry.getNode() == null) { - String msg = "Invalid FlowEntry"; - String logMsg = msg + ": {}"; + if (flowEntry == null || flowEntry.getNode() == null || flowEntry.getFlow() == null) { + String logMsg = INVALID_FLOW_ENTRY + ": {}"; log.warn(logMsg, flowEntry); - return new Status(StatusCode.NOTACCEPTABLE, msg); + return new Status(StatusCode.NOTACCEPTABLE, INVALID_FLOW_ENTRY); + } + + /* + * Redundant Check: Check if the request is a redundant one from the + * same application the flowEntry is equal to an existing one. Given we + * do not have an application signature in the requested FlowEntry yet, + * we are here detecting the above condition by comparing the flow + * names, if set. If they are equal to the installed flow, most likely + * this is a redundant installation request from the same application + * and we can silently return success + * + * TODO: in future a sort of application reference list mechanism will + * be added to the FlowEntry so that exact flow can be used by different + * applications. + */ + FlowEntry present = this.originalSwView.get(flowEntry); + if (present != null) { + boolean sameFlow = present.getFlow().equals(flowEntry.getFlow()); + boolean sameApp = present.getFlowName() != null && present.getFlowName().equals(flowEntry.getFlowName()); + if (sameFlow && sameApp) { + log.trace("Skipping redundant request for flow {} on node {}", flowEntry.getFlowName(), + flowEntry.getNode()); + return new Status(StatusCode.SUCCESS, "Entry is already present"); + } } /* @@ -324,7 +348,7 @@ public class ForwardingRulesManager implements succeded = ret; } else { error = ret; - log.warn("Failed to install the entry: {}. The failure is: {}", installEntry, ret.getDescription()); + log.trace("Failed to install the entry: {}. The failure is: {}", installEntry, ret.getDescription()); } } @@ -380,8 +404,8 @@ public class ForwardingRulesManager implements // Sanity checks if (currentFlowEntry == null || currentFlowEntry.getNode() == null || newFlowEntry == null - || newFlowEntry.getNode() == null) { - String msg = "Modify: Invalid FlowEntry"; + || newFlowEntry.getNode() == null || newFlowEntry.getFlow() == null) { + String msg = "Modify: " + INVALID_FLOW_ENTRY; String logMsg = msg + ": {} or {}"; log.warn(logMsg, currentFlowEntry, newFlowEntry); return new Status(StatusCode.NOTACCEPTABLE, msg); @@ -570,7 +594,7 @@ public class ForwardingRulesManager implements .getFlow()); if (!status.isSuccess()) { - log.warn("SDN Plugin failed to program the flow: {}. The failure is: {}", newEntries.getInstall(), + log.trace("SDN Plugin failed to program the flow: {}. The failure is: {}", newEntries.getInstall(), status.getDescription()); return status; } @@ -601,11 +625,10 @@ public class ForwardingRulesManager implements Status error = new Status(null, null); // Sanity Check - if (flowEntry == null || flowEntry.getNode() == null) { - String msg = "Invalid FlowEntry"; - String logMsg = msg + ": {}"; + if (flowEntry == null || flowEntry.getNode() == null || flowEntry.getFlow() == null) { + String logMsg = INVALID_FLOW_ENTRY + ": {}"; log.warn(logMsg, flowEntry); - return new Status(StatusCode.NOTACCEPTABLE, msg); + return new Status(StatusCode.NOTACCEPTABLE, INVALID_FLOW_ENTRY); } // Derive the container flows merged installed entries @@ -630,7 +653,7 @@ public class ForwardingRulesManager implements if (!ret.isSuccess()) { error = ret; - log.warn("Failed to remove the entry: {}. The failure is: {}", entry.getInstall(), ret.getDescription()); + log.trace("Failed to remove the entry: {}. The failure is: {}", entry.getInstall(), ret.getDescription()); if (installedList.size() == 1) { // If we had only one entry to remove, this is fatal failure return error; @@ -688,7 +711,7 @@ public class ForwardingRulesManager implements .getFlow()); if (!status.isSuccess()) { - log.warn("SDN Plugin failed to program the flow: {}. The failure is: {}", entry.getInstall(), + log.trace("SDN Plugin failed to remove the flow: {}. The failure is: {}", entry.getInstall(), status.getDescription()); return status; } @@ -738,7 +761,7 @@ public class ForwardingRulesManager implements .getFlow()); if (!status.isSuccess()) { - log.warn("SDN Plugin failed to program the flow: {}. The failure is: {}", entry.getInstall(), + log.trace("SDN Plugin failed to program the flow: {}. The failure is: {}", entry.getInstall(), status.getDescription()); return status; } @@ -908,7 +931,7 @@ public class ForwardingRulesManager implements updateLocalDatabase(target, false); } else { // log the error - log.warn("SDN Plugin failed to remove the flow: {}. The failure is: {}", target.getInstall(), + log.trace("SDN Plugin failed to remove the flow: {}. The failure is: {}", target.getInstall(), status.getDescription()); } @@ -1126,7 +1149,7 @@ public class ForwardingRulesManager implements * merged flow may conflict with an existing old container flows merged flow * on the network node */ - private void updateFlowsContainerFlow() { + protected void updateFlowsContainerFlow() { Set toReInstall = new HashSet(); // First remove all installed entries for (ConcurrentMap.Entry entry : installedSwView.entrySet()) { @@ -1366,9 +1389,6 @@ public class ForwardingRulesManager implements clusterContainerService.createCache("frm.staticFlows", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache("frm.flowsSaveEvent", - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache("frm.staticFlowsOrdinal", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); @@ -1381,11 +1401,11 @@ public class ForwardingRulesManager implements clusterContainerService.createCache("frm.TSPolicies", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache(WORKSTATUSCACHE, - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + clusterContainerService.createCache(WORK_STATUS_CACHE, + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL, IClusterServices.cacheMode.ASYNC)); - clusterContainerService.createCache(WORKORDERCACHE, - EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL)); + clusterContainerService.createCache(WORK_ORDER_CACHE, + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL, IClusterServices.cacheMode.ASYNC)); } catch (CacheConfigException cce) { log.error("CacheConfigException"); @@ -1476,18 +1496,18 @@ public class ForwardingRulesManager implements log.error("Retrieval of frm.TSPolicies cache failed for Container {}", container.getName()); } - map = clusterContainerService.getCache(WORKORDERCACHE); + map = clusterContainerService.getCache(WORK_ORDER_CACHE); if (map != null) { workOrder = (ConcurrentMap) map; } else { - log.error("Retrieval of " + WORKORDERCACHE + " cache failed for Container {}", container.getName()); + log.error("Retrieval of " + WORK_ORDER_CACHE + " cache failed for Container {}", container.getName()); } - map = clusterContainerService.getCache(WORKSTATUSCACHE); + map = clusterContainerService.getCache(WORK_STATUS_CACHE); if (map != null) { workStatus = (ConcurrentMap) map; } else { - log.error("Retrieval of " + WORKSTATUSCACHE + " cache failed for Container {}", container.getName()); + log.error("Retrieval of " + WORK_STATUS_CACHE + " cache failed for Container {}", container.getName()); } } @@ -1533,7 +1553,7 @@ public class ForwardingRulesManager implements boolean multipleFlowPush = false; String error; Status status; - config.setStatus(SUCCESS); + config.setStatus(StatusCode.SUCCESS.toString()); // Presence check if (flowConfigExists(config)) { @@ -1611,7 +1631,7 @@ public class ForwardingRulesManager implements continue; } if (config.getNode().equals(node)) { - if (config.installInHw() && !config.getStatus().equals(SUCCESS)) { + if (config.installInHw() && !config.getStatus().equals(StatusCode.SUCCESS.toString())) { Status status = this.installFlowEntryAsync(config.getFlowEntry()); config.setStatus(status.getDescription()); } @@ -1665,7 +1685,7 @@ public class ForwardingRulesManager implements config.setStatus("Removed from node because in container mode"); break; case REMOVED: - config.setStatus(SUCCESS); + config.setStatus(StatusCode.SUCCESS.toString()); break; default: } @@ -1852,7 +1872,7 @@ public class ForwardingRulesManager implements .installFlowEntry(target.getFlowEntry()); if (status.isSuccess()) { // Update Configuration database - target.setStatus(SUCCESS); + target.setStatus(StatusCode.SUCCESS.toString()); target.toggleInstallation(); staticFlows.put(key, target); } @@ -1917,7 +1937,7 @@ public class ForwardingRulesManager implements if (n != null && connectionManager.getLocalityStatus(n) == ConnectionLocality.LOCAL) { Status status = this.removeEntryInternal(flowEntryHw, false); if (!status.isSuccess()) { - log.warn("Failed to remove entry: {}. The failure is: {}", flowEntryHw, status.getDescription()); + log.trace("Failed to remove entry: {}. The failure is: {}", flowEntryHw, status.getDescription()); } } else { log.debug("Not removing entry {} because not connected locally, the remote guy will do it's job", @@ -2063,26 +2083,6 @@ public class ForwardingRulesManager implements public void subnetNotify(Subnet sub, boolean add) { } - private void installImplicitARPReplyPunt(Node node) { - - if (node == null) { - return; - } - - List puntAction = new ArrayList(); - puntAction.add(ActionType.CONTROLLER.toString()); - - FlowConfig allowARP = new FlowConfig(); - allowARP.setInstallInHw(true); - allowARP.setName(FlowConfig.INTERNALSTATICFLOWBEGIN + "Punt ARP Reply" + FlowConfig.INTERNALSTATICFLOWEND); - allowARP.setPriority("500"); - allowARP.setNode(node); - allowARP.setEtherType("0x" + Integer.toHexString(EtherTypes.ARP.intValue()).toUpperCase()); - allowARP.setDstMac(HexEncode.bytesToHexString(switchManager.getControllerMAC())); - allowARP.setActions(puntAction); - addStaticFlowInternal(allowARP, true); // skip validation on internal static flow name - } - /** * (non-Javadoc) * @@ -2255,12 +2255,12 @@ public class ForwardingRulesManager implements List flowConfigForNode = getStaticFlows(nodeConnector.getNode()); for (FlowConfig flowConfig : flowConfigForNode) { if (doesFlowContainNodeConnector(flowConfig.getFlow(), nodeConnector)) { - if (flowConfig.installInHw() && !flowConfig.getStatus().equals(SUCCESS)) { + if (flowConfig.installInHw() && !flowConfig.getStatus().equals(StatusCode.SUCCESS.toString())) { Status status = this.installFlowEntry(flowConfig.getFlowEntry()); if (!status.isSuccess()) { flowConfig.setStatus(status.getDescription()); } else { - flowConfig.setStatus(SUCCESS); + flowConfig.setStatus(StatusCode.SUCCESS.toString()); } updated = true; } @@ -2407,17 +2407,6 @@ public class ForwardingRulesManager implements return true; } - private void usePortGroupConfig(String name) { - PortGroupConfig config = portGroupConfigs.get(name); - if (config == null) { - return; - } - if (portGroupProvider != null) { - Map data = portGroupProvider.getPortGroupData(config); - portGroupData.put(config, data); - } - } - @Override public Map getPortGroupConfigs() { return portGroupConfigs; @@ -2519,11 +2508,12 @@ public class ForwardingRulesManager implements public void run() { while (!stopping) { try { - FRMEvent event = pendingEvents.take(); + final FRMEvent event = pendingEvents.take(); if (event == null) { log.warn("Dequeued null event"); continue; } + log.trace("Dequeued {} event", event.getClass().getSimpleName()); if (event instanceof NodeUpdateEvent) { NodeUpdateEvent update = (NodeUpdateEvent) event; Node node = update.getNode(); @@ -2544,36 +2534,40 @@ public class ForwardingRulesManager implements /* * Take care of handling the remote Work request */ - WorkOrderEvent work = (WorkOrderEvent) event; - FlowEntryDistributionOrder fe = work.getFe(); - if (fe != null) { - logsync.trace("Executing the workOrder {}", fe); - Status gotStatus = null; - FlowEntryInstall feiCurrent = fe.getEntry(); - FlowEntryInstall feiNew = workOrder.get(fe.getEntry()); - switch (fe.getUpType()) { - case ADDED: - /* - * TODO: Not still sure how to handle the - * sync entries - */ - gotStatus = addEntriesInternal(feiCurrent, true); - break; - case CHANGED: - gotStatus = modifyEntryInternal(feiCurrent, feiNew, true); - break; - case REMOVED: - gotStatus = removeEntryInternal(feiCurrent, true); - break; + Runnable r = new Runnable() { + @Override + public void run() { + WorkOrderEvent work = (WorkOrderEvent) event; + FlowEntryDistributionOrder fe = work.getFe(); + if (fe != null) { + logsync.trace("Executing the workOrder {}", fe); + Status gotStatus = null; + FlowEntryInstall feiCurrent = fe.getEntry(); + FlowEntryInstall feiNew = workOrder.get(fe); + switch (fe.getUpType()) { + case ADDED: + gotStatus = addEntriesInternal(feiCurrent, false); + break; + case CHANGED: + gotStatus = modifyEntryInternal(feiCurrent, feiNew, false); + break; + case REMOVED: + gotStatus = removeEntryInternal(feiCurrent, false); + break; + } + // Remove the Order + workOrder.remove(fe); + logsync.trace( + "The workOrder has been executed and now the status is being returned {}", fe); + // Place the status + workStatus.put(fe, gotStatus); + } else { + log.warn("Not expected null WorkOrder", work); + } } - // Remove the Order - workOrder.remove(fe); - logsync.trace( - "The workOrder has been executed and now the status is being returned {}", fe); - // Place the status - workStatus.put(fe, gotStatus); - } else { - log.warn("Not expected null WorkOrder", work); + }; + if(executor != null) { + executor.execute(r); } } else if (event instanceof WorkStatusCleanup) { /* @@ -2629,11 +2623,19 @@ public class ForwardingRulesManager implements * */ void start() { + /* + * If running in default container, need to know if controller is in + * container mode + */ + if (GlobalConstants.DEFAULT.toString().equals(this.getContainerName())) { + inContainerMode = containerManager.inContainerMode(); + } + // Initialize graceful stop flag stopping = false; // Allocate the executor service - this.executor = Executors.newSingleThreadExecutor(); + this.executor = Executors.newFixedThreadPool(maxPoolSize); // Start event handler thread frmEventHandler.start(); @@ -2882,121 +2884,9 @@ public class ForwardingRulesManager implements @Override public String getHelp() { StringBuffer help = new StringBuffer(); - help.append("---FRM Matrix Application---\n"); - help.append("\t printMatrixData - Prints the Matrix Configs\n"); - help.append("\t addMatrixConfig \n"); - help.append("\t delMatrixConfig \n"); - help.append("\t useMatrixConfig \n"); return help.toString(); } - public void _printMatrixData(CommandInterpreter ci) { - ci.println("Configs : "); - ci.println("---------"); - ci.println(portGroupConfigs); - - ci.println("Data : "); - ci.println("------"); - ci.println(portGroupData); - } - - public void _addMatrixConfig(CommandInterpreter ci) { - String name = ci.nextArgument(); - String regex = ci.nextArgument(); - addPortGroupConfig(name, regex, false); - } - - public void _delMatrixConfig(CommandInterpreter ci) { - String name = ci.nextArgument(); - delPortGroupConfig(name); - } - - public void _useMatrixConfig(CommandInterpreter ci) { - String name = ci.nextArgument(); - usePortGroupConfig(name); - } - - public void _arpPunt(CommandInterpreter ci) { - String switchId = ci.nextArgument(); - long swid = HexEncode.stringToLong(switchId); - Node node = NodeCreator.createOFNode(swid); - installImplicitARPReplyPunt(node); - } - - public void _frmaddflow(CommandInterpreter ci) throws UnknownHostException { - Node node = null; - String nodeId = ci.nextArgument(); - if (nodeId == null) { - ci.print("Node id not specified"); - return; - } - try { - node = NodeCreator.createOFNode(Long.valueOf(nodeId)); - } catch (NumberFormatException e) { - ci.print("Node id not a number"); - return; - } - ci.println(this.programmer.addFlow(node, getSampleFlow(node))); - } - - public void _frmremoveflow(CommandInterpreter ci) throws UnknownHostException { - Node node = null; - String nodeId = ci.nextArgument(); - if (nodeId == null) { - ci.print("Node id not specified"); - return; - } - try { - node = NodeCreator.createOFNode(Long.valueOf(nodeId)); - } catch (NumberFormatException e) { - ci.print("Node id not a number"); - return; - } - ci.println(this.programmer.removeFlow(node, getSampleFlow(node))); - } - - private Flow getSampleFlow(Node node) throws UnknownHostException { - NodeConnector port = NodeConnectorCreator.createOFNodeConnector((short) 24, node); - NodeConnector oport = NodeConnectorCreator.createOFNodeConnector((short) 30, node); - byte srcMac[] = { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x9a, (byte) 0xbc }; - byte dstMac[] = { (byte) 0x1a, (byte) 0x2b, (byte) 0x3c, (byte) 0x4d, (byte) 0x5e, (byte) 0x6f }; - InetAddress srcIP = InetAddress.getByName("172.28.30.50"); - InetAddress dstIP = InetAddress.getByName("171.71.9.52"); - InetAddress ipMask = InetAddress.getByName("255.255.255.0"); - InetAddress ipMask2 = InetAddress.getByName("255.0.0.0"); - short ethertype = EtherTypes.IPv4.shortValue(); - short vlan = (short) 27; - byte vlanPr = 3; - Byte tos = 4; - byte proto = IPProtocols.TCP.byteValue(); - short src = (short) 55000; - short dst = 80; - - /* - * Create a SAL Flow aFlow - */ - Match match = new Match(); - match.setField(MatchType.IN_PORT, port); - match.setField(MatchType.DL_SRC, srcMac); - match.setField(MatchType.DL_DST, dstMac); - match.setField(MatchType.DL_TYPE, ethertype); - match.setField(MatchType.DL_VLAN, vlan); - match.setField(MatchType.DL_VLAN_PR, vlanPr); - match.setField(MatchType.NW_SRC, srcIP, ipMask); - match.setField(MatchType.NW_DST, dstIP, ipMask2); - match.setField(MatchType.NW_TOS, tos); - match.setField(MatchType.NW_PROTO, proto); - match.setField(MatchType.TP_SRC, src); - match.setField(MatchType.TP_DST, dst); - - List actions = new ArrayList(); - actions.add(new Output(oport)); - actions.add(new PopVlan()); - actions.add(new Flood()); - actions.add(new Controller()); - return new Flow(match, actions); - } - @Override public Status saveConfiguration() { return saveConfig(); @@ -3110,7 +3000,7 @@ public class ForwardingRulesManager implements if (target != null) { // Update Configuration database target.toggleInstallation(); - target.setStatus(SUCCESS); + target.setStatus(StatusCode.SUCCESS.toString()); staticFlows.put(key, target); } @@ -3203,6 +3093,16 @@ public class ForwardingRulesManager implements this.connectionManager = s; } + public void unsetIContainerManager(IContainerManager s) { + if (s == this.containerManager) { + this.containerManager = null; + } + } + + public void setIContainerManager(IContainerManager s) { + this.containerManager = s; + } + @Override public void entryCreated(Object key, String cacheName, boolean originLocal) { /* @@ -3218,7 +3118,7 @@ public class ForwardingRulesManager implements */ return; } - if (cacheName.equals(WORKORDERCACHE)) { + if (cacheName.equals(WORK_ORDER_CACHE)) { logsync.trace("Got a WorkOrderCacheUpdate for {}", key); /* * This is the case of one workOrder becoming available, so we need @@ -3236,7 +3136,7 @@ public class ForwardingRulesManager implements // processing pendingEvents.offer(new WorkOrderEvent(fe, (FlowEntryInstall) new_value)); } - } else if (cacheName.equals(WORKSTATUSCACHE)) { + } else if (cacheName.equals(WORK_STATUS_CACHE)) { logsync.trace("Got a WorkStatusCacheUpdate for {}", key); /* * This is the case of one workOrder being completed and a status @@ -3266,4 +3166,37 @@ public class ForwardingRulesManager implements * Do nothing */ } + + /** + * {@inheritDoc} + */ + @Override + public List getFlowEntriesForNode(Node node) { + List list = new ArrayList(); + if (node != null) { + for (Map.Entry entry : this.originalSwView.entrySet()) { + if (node.equals(entry.getKey().getNode())) { + list.add(entry.getKey().clone()); + } + } + } + return list; + } + + /** + * {@inheritDoc} + */ + @Override + public List getInstalledFlowEntriesForNode(Node node) { + List list = new ArrayList(); + if (node != null) { + List flowEntryInstallList = this.nodeFlows.get(node); + if(flowEntryInstallList != null) { + for(FlowEntryInstall fi: flowEntryInstallList) { + list.add(fi.getInstall().clone()); + } + } + } + return list; + } }