[JIRA-3148] install only one meter per bandwidth profile on eapol flows

Change-Id: Ie2f1922cf3854b47d9a2d34a44410ef883b3fe2e
diff --git a/app/src/main/java/org/opencord/olt/impl/OltMeterService.java b/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
index be15854..65a72f0 100644
--- a/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
+++ b/app/src/main/java/org/opencord/olt/impl/OltMeterService.java
@@ -43,6 +43,7 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.opencord.olt.internalapi.AccessDeviceMeterService;
+import org.opencord.olt.internalapi.DeviceBandwidthProfile;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
@@ -60,7 +61,9 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
+import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -109,6 +112,8 @@
 
     protected ExecutorService eventExecutor;
 
+    private Set<DeviceBandwidthProfile> pendingMeters;
+
     @Activate
     public void activate(ComponentContext context) {
         eventExecutor = Executors.newFixedThreadPool(5, groupedThreads("onos/olt",
@@ -129,6 +134,7 @@
 
         meterService.addListener(meterListener);
         componentConfigService.registerProperties(getClass());
+        pendingMeters = ConcurrentHashMap.newKeySet();
         log.info("Olt Meter service started");
     }
 
@@ -195,6 +201,7 @@
     @Override
     public MeterId createMeter(DeviceId deviceId, BandwidthProfileInformation bpInfo,
                                CompletableFuture<Object> meterFuture) {
+        log.debug("Installing meter on {} for {}", deviceId, bpInfo);
         if (bpInfo == null) {
             log.warn("Requested bandwidth profile information is NULL");
             meterFuture.complete(ObjectiveError.BADPARAMS);
@@ -218,7 +225,7 @@
                     @Override
                     public void onSuccess(MeterRequest op) {
                         log.debug("Meter {} is installed on the device {}",
-                                 meterId, deviceId);
+                                 meterIdRef.get(), deviceId);
                         addMeterIdToBpMapping(deviceId, meterIdRef.get(), bpInfo.id());
                         meterFuture.complete(null);
                     }
@@ -244,6 +251,21 @@
     }
 
     @Override
+    public void addToPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile) {
+        pendingMeters.add(deviceBandwidthProfile);
+    }
+
+    @Override
+    public void removeFromPendingMeters(DeviceBandwidthProfile deviceBandwidthProfile) {
+        pendingMeters.remove(deviceBandwidthProfile);
+    }
+
+    @Override
+    public boolean isMeterPending(DeviceBandwidthProfile deviceBandwidthProfile) {
+        return pendingMeters.contains(deviceBandwidthProfile);
+    }
+
+    @Override
     public void clearMeters(DeviceId deviceId) {
         List<Map.Entry<String, MeterKey>> meters = bpInfoToMeter.stream()
                 .filter(e -> e.getValue().deviceId().equals(deviceId))