trying to fix flow state
Change-Id: I62845842c66cb99cb14bd54bc9602edf7c0cae39
diff --git a/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
index 41f7303..5bd6fed 100644
--- a/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
@@ -4,6 +4,7 @@
import static org.slf4j.LoggerFactory.getLogger;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import org.apache.felix.scr.annotations.Activate;
@@ -17,7 +18,9 @@
import org.onlab.onos.net.Device;
import org.onlab.onos.net.DeviceId;
import org.onlab.onos.net.device.DeviceService;
+import org.onlab.onos.net.flow.DefaultFlowRule;
import org.onlab.onos.net.flow.FlowRule;
+import org.onlab.onos.net.flow.FlowRule.FlowRuleState;
import org.onlab.onos.net.flow.FlowRuleEvent;
import org.onlab.onos.net.flow.FlowRuleListener;
import org.onlab.onos.net.flow.FlowRuleProvider;
@@ -29,17 +32,19 @@
import org.onlab.onos.net.provider.AbstractProviderService;
import org.slf4j.Logger;
+import com.google.common.collect.Lists;
+
@Component(immediate = true)
@Service
public class FlowRuleManager
- extends AbstractProviderRegistry<FlowRuleProvider, FlowRuleProviderService>
- implements FlowRuleService, FlowRuleProviderRegistry {
+extends AbstractProviderRegistry<FlowRuleProvider, FlowRuleProviderService>
+implements FlowRuleService, FlowRuleProviderRegistry {
public static final String FLOW_RULE_NULL = "FlowRule cannot be null";
private final Logger log = getLogger(getClass());
private final AbstractListenerRegistry<FlowRuleEvent, FlowRuleListener>
- listenerRegistry = new AbstractListenerRegistry<>();
+ listenerRegistry = new AbstractListenerRegistry<>();
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected FlowRuleStore store;
@@ -72,7 +77,7 @@
List<FlowRule> entries = new ArrayList<FlowRule>();
for (int i = 0; i < flowRules.length; i++) {
- FlowRule f = flowRules[i];
+ FlowRule f = new DefaultFlowRule(flowRules[i], FlowRuleState.PENDING_ADD);
final Device device = deviceService.getDevice(f.deviceId());
final FlowRuleProvider frp = getProvider(device.providerId());
entries.add(store.storeFlowRule(f));
@@ -85,7 +90,7 @@
@Override
public void removeFlowRules(FlowRule... flowRules) {
for (int i = 0; i < flowRules.length; i++) {
- FlowRule f = flowRules[i];
+ FlowRule f = new DefaultFlowRule(flowRules[i], FlowRuleState.PENDING_REMOVE);
final Device device = deviceService.getDevice(f.deviceId());
final FlowRuleProvider frp = getProvider(device.providerId());
store.removeFlowRule(f);
@@ -111,8 +116,8 @@
}
private class InternalFlowRuleProviderService
- extends AbstractProviderService<FlowRuleProvider>
- implements FlowRuleProviderService {
+ extends AbstractProviderService<FlowRuleProvider>
+ implements FlowRuleProviderService {
protected InternalFlowRuleProviderService(FlowRuleProvider provider) {
super(provider);
@@ -160,8 +165,32 @@
}
@Override
- public void pushFlowMetrics(Iterable<FlowRule> flowEntries) {
- // TODO Auto-generated method stub
+ public void pushFlowMetrics(DeviceId deviceId, Iterable<FlowRule> flowEntries) {
+ List<FlowRule> storedRules = Lists.newLinkedList(store.getFlowEntries(deviceId));
+ List<FlowRule> switchRules = Lists.newLinkedList(flowEntries);
+ Iterator<FlowRule> switchRulesIterator = switchRules.iterator();
+ List<FlowRule> extraRules = Lists.newLinkedList();
+
+ while (switchRulesIterator.hasNext()) {
+ FlowRule rule = switchRulesIterator.next();
+ if (storedRules.remove(rule)) {
+ // we both have the rule let's update some info then.
+ log.info("rule {} is added. {}", rule.id(), rule.state());
+ flowAdded(rule);
+ } else {
+ // the device a rule the store does not have
+ extraRules.add(rule);
+ }
+ }
+ for (FlowRule rule : storedRules) {
+ // there are rules in the store that aren't on the switch
+ flowMissing(rule);
+ }
+ if (extraRules.size() > 0) {
+ log.warn("Device {} has extra flow rules: {}", deviceId, extraRules);
+ // TODO do something with this.
+ }
+
}
}