Moving meter store implementation to use map events
Change-Id: I338473b7286d7b9e5cdfb938f16c7b6155d4cbb5
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 b0726d6..47450c7 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
@@ -21,6 +21,7 @@
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.TriConsumer;
import org.onosproject.incubator.net.meter.DefaultMeter;
import org.onosproject.incubator.net.meter.Meter;
import org.onosproject.incubator.net.meter.MeterEvent;
@@ -35,6 +36,7 @@
import org.onosproject.incubator.net.meter.MeterState;
import org.onosproject.incubator.net.meter.MeterStore;
import org.onosproject.incubator.net.meter.MeterStoreDelegate;
+import org.onosproject.incubator.net.meter.MeterStoreResult;
import org.onosproject.net.DeviceId;
import org.onosproject.net.provider.AbstractListenerProviderRegistry;
import org.onosproject.net.provider.AbstractProviderService;
@@ -44,7 +46,6 @@
import java.util.Collection;
-import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
@@ -69,11 +70,29 @@
private AtomicCounter meterIdCounter;
+ private TriConsumer<MeterOperation, MeterStoreResult, Throwable> onComplete;
+
@Activate
public void activate() {
meterIdCounter = storageService.atomicCounterBuilder()
.withName(meterIdentifier)
.build();
+
+ onComplete = (op, result, error) ->
+ {
+ op.context().ifPresent(c -> {
+ if (error != null) {
+ c.onError(op.meter(), MeterFailReason.UNKNOWN);
+ } else {
+ if (result.reason().isPresent()) {
+ c.onError(op.meter(), result.reason().get());
+ } else {
+ c.onSuccess(op.meter());
+ }
+ }
+ });
+
+ };
log.info("Started");
}
@@ -88,31 +107,27 @@
}
@Override
- public void addMeter(Meter meter) {
- DefaultMeter m = (DefaultMeter) meter;
+ public void addMeter(MeterOperation op) {
+ DefaultMeter m = (DefaultMeter) op.meter();
m.setState(MeterState.PENDING_ADD);
- store.storeMeter(m);
+ store.storeMeter(m).whenComplete((result, error) ->
+ onComplete.accept(op, result, error));
}
@Override
- public void updateMeter(Meter meter) {
- DefaultMeter m = (DefaultMeter) meter;
+ public void updateMeter(MeterOperation op) {
+ DefaultMeter m = (DefaultMeter) op.meter();
m.setState(MeterState.PENDING_ADD);
- store.updateMeter(m);
+ store.updateMeter(m).whenComplete((result, error) ->
+ onComplete.accept(op, result, error));
}
@Override
- public void removeMeter(Meter meter) {
- DefaultMeter m = (DefaultMeter) meter;
+ public void removeMeter(MeterOperation op) {
+ DefaultMeter m = (DefaultMeter) op.meter();
m.setState(MeterState.PENDING_REMOVE);
- store.deleteMeter(m);
- }
-
- @Override
- public void removeMeter(MeterId id) {
- DefaultMeter meter = (DefaultMeter) store.getMeter(id);
- checkNotNull(meter, "No such meter {}", id);
- removeMeter(meter);
+ store.deleteMeter(m).whenComplete((result, error) ->
+ onComplete.accept(op, result, error));
}
@Override
@@ -155,17 +170,18 @@
@Override
public void notify(MeterEvent event) {
- DeviceId deviceId = event.subject().meter().deviceId();
- MeterProvider p = getProvider(event.subject().meter().deviceId());
+ DeviceId deviceId = event.subject().deviceId();
+ MeterProvider p = getProvider(event.subject().deviceId());
switch (event.type()) {
- case METER_UPDATED:
+ case METER_ADD_REQ:
+ p.performMeterOperation(deviceId, new MeterOperation(event.subject(),
+ MeterOperation.Type.ADD,
+ null));
break;
- case METER_OP_FAILED:
- event.subject().meter().context().ifPresent(c ->
- c.onError(event.subject(), event.reason()));
- break;
- case METER_OP_REQ:
- p.performMeterOperation(deviceId, event.subject());
+ case METER_REM_REQ:
+ p.performMeterOperation(deviceId, new MeterOperation(event.subject(),
+ MeterOperation.Type.REMOVE,
+ null));
break;
default:
log.warn("Unknown meter event {}", event.type());