Adding getFlowEntryCount(DeviceId) API.
Change-Id: Idc23d05d5ba8f2897f13bb3af075eadc1b8ab348
diff --git a/core/api/src/main/java/org/onosproject/net/flow/FlowRuleService.java b/core/api/src/main/java/org/onosproject/net/flow/FlowRuleService.java
index a4cfdfd..0ade2ed 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/FlowRuleService.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/FlowRuleService.java
@@ -43,6 +43,16 @@
int getFlowRuleCount();
/**
+ * Returns the number of flow rules for the given device.
+ *
+ * @param deviceId device identifier
+ * @return number of flow rules for the given device
+ */
+ default int getFlowRuleCount(DeviceId deviceId) {
+ return 0;
+ }
+
+ /**
* Returns the collection of flow entries applied on the specified device.
* This will include flow rules which may not yet have been applied to
* the device.
diff --git a/core/api/src/main/java/org/onosproject/net/flow/FlowRuleStore.java b/core/api/src/main/java/org/onosproject/net/flow/FlowRuleStore.java
index 13a91a7..937abe4 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/FlowRuleStore.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/FlowRuleStore.java
@@ -33,6 +33,16 @@
int getFlowRuleCount();
/**
+ * Returns the number of flow rules for the given device in the store.
+ *
+ * @param deviceId device identifier
+ * @return number of flow rules for the given device
+ */
+ default int getFlowRuleCount(DeviceId deviceId) {
+ return 0;
+ }
+
+ /**
* Returns the stored flow.
*
* @param rule the rule to look for
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
index 04b73d0..7c79a57 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
@@ -89,8 +89,6 @@
import static org.onosproject.security.AppPermission.Type.FLOWRULE_WRITE;
import static org.slf4j.LoggerFactory.getLogger;
-
-
/**
* Provides implementation of the flow NB & SB APIs.
*/
@@ -103,6 +101,7 @@
private final Logger log = getLogger(getClass());
+ public static final String DEVICE_ID_NULL = "Device ID cannot be null";
public static final String FLOW_RULE_NULL = "FlowRule cannot be null";
private static final boolean ALLOW_EXTRANEOUS_RULES = false;
@@ -232,8 +231,16 @@
}
@Override
+ public int getFlowRuleCount(DeviceId deviceId) {
+ checkPermission(FLOWRULE_READ);
+ checkNotNull(deviceId, DEVICE_ID_NULL);
+ return store.getFlowRuleCount(deviceId);
+ }
+
+ @Override
public Iterable<FlowEntry> getFlowEntries(DeviceId deviceId) {
checkPermission(FLOWRULE_READ);
+ checkNotNull(deviceId, DEVICE_ID_NULL);
return store.getFlowEntries(deviceId);
}
@@ -251,6 +258,7 @@
@Override
public void purgeFlowRules(DeviceId deviceId) {
checkPermission(FLOWRULE_WRITE);
+ checkNotNull(deviceId, DEVICE_ID_NULL);
store.purgeFlowRule(deviceId);
}
@@ -713,11 +721,13 @@
@Override
public Iterable<TableStatisticsEntry> getFlowTableStatistics(DeviceId deviceId) {
checkPermission(FLOWRULE_READ);
+ checkNotNull(deviceId, DEVICE_ID_NULL);
return store.getTableStatistics(deviceId);
}
@Override
public long getActiveFlowRuleCount(DeviceId deviceId) {
+ checkNotNull(deviceId, DEVICE_ID_NULL);
return store.getActiveFlowRuleCount(deviceId);
}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java
index 73db656..e3f419b 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java
@@ -30,7 +30,6 @@
import java.util.stream.Collectors;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.common.collect.Streams;
@@ -310,10 +309,22 @@
@Override
public int getFlowRuleCount() {
return Streams.stream(deviceService.getDevices()).parallel()
- .mapToInt(device -> Iterables.size(getFlowEntries(device.id())))
+ .mapToInt(device -> getFlowRuleCount(device.id()))
.sum();
}
+ @Override
+ public int getFlowRuleCount(DeviceId deviceId) {
+ DocumentPath path = getPathFor(deviceId);
+ try {
+ return flows.getChildren(path).values().stream()
+ .mapToInt(v -> v.value().values().size())
+ .sum();
+ } catch (NoSuchDocumentPathException e) {
+ return 0;
+ }
+ }
+
/**
* Returns the {@link DocumentPath} for the given {@link DeviceId}.
*
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
index aa920e2..0a5eee0 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
@@ -43,7 +43,6 @@
import org.onosproject.net.HostLocation;
import org.onosproject.net.Link;
import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.flow.FlowEntry;
import org.onosproject.net.host.HostEvent;
import org.onosproject.net.link.LinkEvent;
import org.onosproject.net.provider.ProviderId;
@@ -544,11 +543,7 @@
}
protected int getFlowCount(DeviceId deviceId) {
- int count = 0;
- for (FlowEntry flowEntry : services.flow().getFlowEntries(deviceId)) {
- count++;
- }
- return count;
+ return services.flow().getFlowRuleCount(deviceId);
}
protected int getTunnelCount(DeviceId deviceId) {