FlowRule subsystem bugfixes
- RULE_ADDED will be posted when the Flow was confirmed by stats,
even if they were installed as a batch
- Properly handle batch in Simple store
Change-Id: I0a0e15b29ff9c0d56d5a646e0751511d73c8f552
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 4fe9022..bd7fb94 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
@@ -371,10 +371,11 @@
final FlowRuleBatchRequest request = event.subject();
switch (event.type()) {
case BATCH_OPERATION_REQUESTED:
- for (FlowEntry entry : request.toAdd()) {
+ // Request has been forwarded to MASTER Node, and was
+ for (FlowRule entry : request.toAdd()) {
eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_ADD_REQUESTED, entry));
}
- for (FlowEntry entry : request.toRemove()) {
+ for (FlowRule entry : request.toRemove()) {
eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_REMOVE_REQUESTED, entry));
}
// FIXME: what about op.equals(FlowRuleOperation.MODIFY) ?
@@ -392,21 +393,15 @@
Futures.getUnchecked(result)));
}
}, futureListeners);
+ break;
- break;
case BATCH_OPERATION_COMPLETED:
- Set<FlowRule> failedItems = event.result().failedItems();
- for (FlowEntry entry : request.toAdd()) {
- if (!failedItems.contains(entry)) {
- eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_ADDED, entry));
- }
- }
- for (FlowEntry entry : request.toRemove()) {
- if (!failedItems.contains(entry)) {
- eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_REMOVED, entry));
- }
- }
+ // MASTER Node has pushed the batch down to the Device
+
+ // Note: RULE_ADDED will be posted
+ // when Flow was actually confirmed by stats reply.
break;
+
default:
break;
}
diff --git a/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
index b986d6d..f67d992 100644
--- a/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
@@ -148,7 +148,7 @@
int i = 0;
System.err.println("events :" + listener.events);
for (FlowRuleEvent e : listener.events) {
- assertTrue("unexpected event", e.type().equals(events[i]));
+ assertEquals("unexpected event", events[i], e.type());
i++;
}
@@ -178,15 +178,13 @@
RULE_ADDED, RULE_ADDED);
addFlowRule(1);
+ System.err.println("events :" + listener.events);
assertEquals("should still be 2 rules", 2, flowCount());
providerService.pushFlowMetrics(DID, ImmutableList.of(fe1));
validateEvents(RULE_UPDATED);
}
-
- // TODO: If preserving iteration order is a requirement, redo FlowRuleStore.
- //backing store is sensitive to the order of additions/removals
private boolean validateState(Map<FlowRule, FlowEntryState> expected) {
Map<FlowRule, FlowEntryState> expectedToCheck = new HashMap<>(expected);
Iterable<FlowEntry> rules = service.getFlowEntries(DID);
@@ -539,17 +537,17 @@
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
- return true;
+ return false;
}
@Override
public boolean isCancelled() {
- return true;
+ return false;
}
@Override
public boolean isDone() {
- return false;
+ return true;
}
@Override
@@ -562,12 +560,14 @@
public CompletedBatchOperation get(long timeout, TimeUnit unit)
throws InterruptedException,
ExecutionException, TimeoutException {
- return null;
+ return new CompletedBatchOperation(true, Collections.<FlowRule>emptySet());
}
@Override
public void addListener(Runnable task, Executor executor) {
- // TODO: add stuff.
+ if (isDone()) {
+ executor.execute(task);
+ }
}
}