[ONOS-5599] Store meter features into MeterStore
Change-Id: I22f7366b87cad6fc706b6ff7b0ccff1a0e85ad6a
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 2cf658f..37251f6 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
@@ -29,6 +29,7 @@
import org.onosproject.net.meter.Meter;
import org.onosproject.net.meter.MeterEvent;
import org.onosproject.net.meter.MeterFailReason;
+import org.onosproject.net.meter.MeterFeatures;
import org.onosproject.net.meter.MeterId;
import org.onosproject.net.meter.MeterKey;
import org.onosproject.net.meter.MeterListener;
@@ -226,6 +227,16 @@
}
});
}
+
+ @Override
+ public void pushMeterFeatures(DeviceId deviceId, MeterFeatures meterfeatures) {
+ store.storeMeterFeatures(meterfeatures);
+ }
+
+ @Override
+ public void deleteMeterFeatures(DeviceId deviceId) {
+ store.deleteMeterFeatures(deviceId);
+ }
}
private class InternalMeterStoreDelegate implements MeterStoreDelegate {
diff --git a/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java b/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java
index 05832c7..a81004f 100644
--- a/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java
+++ b/incubator/net/src/test/java/org/onosproject/incubator/net/meter/impl/MeterManagerTest.java
@@ -35,8 +35,10 @@
import org.onosproject.net.meter.Band;
import org.onosproject.net.meter.DefaultBand;
import org.onosproject.net.meter.DefaultMeter;
+import org.onosproject.net.meter.DefaultMeterFeatures;
import org.onosproject.net.meter.DefaultMeterRequest;
import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterFeaturesKey;
import org.onosproject.net.meter.MeterId;
import org.onosproject.net.meter.MeterOperation;
import org.onosproject.net.meter.MeterOperations;
@@ -51,13 +53,12 @@
import org.onosproject.store.service.TestStorageService;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
import static org.onosproject.net.NetTestTools.APP_ID;
import static org.onosproject.net.NetTestTools.did;
import static org.onosproject.net.NetTestTools.injectEventDispatcher;
@@ -96,6 +97,24 @@
TestUtils.setField(meterStore, "clusterService", new TestClusterService());
TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
meterStore.activate();
+ meterStore.storeMeterFeatures(DefaultMeterFeatures.builder().forDevice(did("1"))
+ .withMaxMeters(255L)
+ .withBandTypes(new HashSet<>())
+ .withUnits(new HashSet<>())
+ .hasStats(false)
+ .hasBurst(false)
+ .withMaxBands((byte) 0)
+ .withMaxColors((byte) 0)
+ .build());
+ meterStore.storeMeterFeatures(DefaultMeterFeatures.builder().forDevice(did("2"))
+ .withMaxMeters(2)
+ .withBandTypes(new HashSet<>())
+ .withUnits(new HashSet<>())
+ .hasBurst(false)
+ .hasStats(false)
+ .withMaxBands((byte) 0)
+ .withMaxColors((byte) 0)
+ .build());
manager = new MeterManager();
manager.store = meterStore;
@@ -195,6 +214,14 @@
assertThat(manager.getMeter(did("2"), MeterId.meterId(1)), is(m2));
}
+ @Test
+ public void testMeterFeatures() {
+ assertEquals(meterStore.getMaxMeters(MeterFeaturesKey.key(did("1"))), 255L);
+ assertEquals(meterStore.getMaxMeters(MeterFeaturesKey.key(did("2"))), 2);
+ }
+
+
+
public class TestApplicationId extends DefaultApplicationId {
public TestApplicationId(int id, String name) {
super(id, name);
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
index be7de21..b681c27 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
@@ -26,18 +26,22 @@
import org.onosproject.cluster.ClusterService;
import org.onosproject.cluster.NodeId;
import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.DeviceId;
import org.onosproject.net.meter.Band;
import org.onosproject.net.meter.DefaultBand;
import org.onosproject.net.meter.DefaultMeter;
import org.onosproject.net.meter.Meter;
import org.onosproject.net.meter.MeterEvent;
import org.onosproject.net.meter.MeterFailReason;
+import org.onosproject.net.meter.MeterFeatures;
+import org.onosproject.net.meter.MeterFeaturesKey;
import org.onosproject.net.meter.MeterKey;
import org.onosproject.net.meter.MeterOperation;
import org.onosproject.net.meter.MeterState;
import org.onosproject.net.meter.MeterStore;
import org.onosproject.net.meter.MeterStoreDelegate;
import org.onosproject.net.meter.MeterStoreResult;
+import org.onosproject.net.meter.DefaultMeterFeatures;
import org.onosproject.store.AbstractStore;
import org.onosproject.store.serializers.KryoNamespaces;
import org.onosproject.store.service.ConsistentMap;
@@ -54,6 +58,7 @@
import java.util.Map;
import java.util.concurrent.CompletableFuture;
+import static org.onosproject.net.meter.MeterFailReason.TIMEOUT;
import static org.slf4j.LoggerFactory.getLogger;
/**
@@ -68,6 +73,7 @@
private Logger log = getLogger(getClass());
private static final String METERSTORE = "onos-meter-store";
+ private static final String METERFEATURESSTORE = "onos-meter-features-store";
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private StorageService storageService;
@@ -81,6 +87,8 @@
private ConsistentMap<MeterKey, MeterData> meters;
private NodeId local;
+ private ConsistentMap<MeterFeaturesKey, MeterFeatures> meterFeatures;
+
private MapEventListener<MeterKey, MeterData> mapListener = new InternalMapEventListener();
private Map<MeterKey, CompletableFuture<MeterStoreResult>> futures =
@@ -106,6 +114,16 @@
meters.addListener(mapListener);
+ meterFeatures = storageService.<MeterFeaturesKey, MeterFeatures>consistentMapBuilder()
+ .withName(METERFEATURESSTORE)
+ .withSerializer(Serializer.using(Arrays.asList(KryoNamespaces.API),
+ MeterFeaturesKey.class,
+ MeterFeatures.class,
+ DefaultMeterFeatures.class,
+ Band.Type.class,
+ Meter.Unit.class,
+ MeterFailReason.class)).build();
+
log.info("Started");
}
@@ -157,6 +175,30 @@
}
@Override
+ public MeterStoreResult storeMeterFeatures(MeterFeatures meterfeatures) {
+ MeterStoreResult result = MeterStoreResult.success();
+ MeterFeaturesKey key = MeterFeaturesKey.key(meterfeatures.deviceId());
+ try {
+ meterFeatures.putIfAbsent(key, meterfeatures);
+ } catch (StorageException e) {
+ result = MeterStoreResult.fail(TIMEOUT);
+ }
+ return result;
+ }
+
+ @Override
+ public MeterStoreResult deleteMeterFeatures(DeviceId deviceId) {
+ MeterStoreResult result = MeterStoreResult.success();
+ MeterFeaturesKey key = MeterFeaturesKey.key(deviceId);
+ try {
+ meterFeatures.remove(key);
+ } catch (StorageException e) {
+ result = MeterStoreResult.fail(TIMEOUT);
+ }
+ return result;
+ }
+
+ @Override
public CompletableFuture<MeterStoreResult> updateMeter(Meter meter) {
CompletableFuture<MeterStoreResult> future = new CompletableFuture<>();
MeterKey key = MeterKey.key(meter.deviceId(), meter.id());
@@ -214,6 +256,12 @@
meters.remove(key);
}
+ @Override
+ public long getMaxMeters(MeterFeaturesKey key) {
+ MeterFeatures features = Versioned.valueOrElse(meterFeatures.get(key), null);
+ return features == null ? 0L : features.maxMeter();
+ }
+
private class InternalMapEventListener implements MapEventListener<MeterKey, MeterData> {
@Override
public void event(MapEvent<MeterKey, MeterData> event) {