ONOS-6625: Remove meters from device not present in onos
Change-Id: I857daf1176a2242b88c5acd9d6aae82331327dd4
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
index 1fea477..255e2928 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
@@ -248,23 +248,34 @@
@Override
public void pushMeterMetrics(DeviceId deviceId, Collection<Meter> meterEntries) {
- //FIXME: FOLLOWING CODE CANNOT BE TESTED UNTIL SOMETHING THAT
- //FIXME: IMPLEMENTS METERS EXISTS
Collection<Meter> allMeters = store.getAllMeters(deviceId);
Map<MeterId, Meter> meterEntriesMap = meterEntries.stream()
.collect(Collectors.toMap(Meter::id, Meter -> Meter));
+ // Look for meters defined in onos and missing in the device (restore)
allMeters.stream().forEach(m -> {
if ((m.state().equals(MeterState.PENDING_ADD) ||
m.state().equals(MeterState.ADDED)) &&
!meterEntriesMap.containsKey(m.id())) {
// The meter is missing in the device. Reinstall!
+ log.debug("Adding meter missing in device {} {}", deviceId, m);
provider().performMeterOperation(deviceId,
new MeterOperation(m, MeterOperation.Type.ADD));
}
});
+ // Look for meters defined in the device and not in onos (remove)
+ meterEntriesMap.entrySet().stream()
+ .filter(md -> !allMeters.stream().anyMatch(m -> m.id().equals(md.getKey())))
+ .forEach(mio -> {
+ // The meter is missin in onos. Uninstall!
+ log.debug("Remove meter in device not in onos {} {}", deviceId, mio.getKey());
+ Meter meter = mio.getValue();
+ provider().performMeterOperation(deviceId,
+ new MeterOperation(meter, MeterOperation.Type.REMOVE));
+ });
+
meterEntries.stream()
.filter(m -> allMeters.stream()
.anyMatch(sm -> sm.deviceId().equals(deviceId) && sm.id().equals(m.id())))