[VOL-3260] Purging all meter state on OLT delete

Change-Id: I6323779d584b341d33cc91231197504b80a91fc4
diff --git a/app/src/main/java/org/opencord/olt/impl/Olt.java b/app/src/main/java/org/opencord/olt/impl/Olt.java
index fe2675e..1f3634b 100644
--- a/app/src/main/java/org/opencord/olt/impl/Olt.java
+++ b/app/src/main/java/org/opencord/olt/impl/Olt.java
@@ -83,7 +83,6 @@
 import org.opencord.olt.AccessSubscriberId;
 import org.opencord.olt.internalapi.AccessDeviceFlowService;
 import org.opencord.olt.internalapi.AccessDeviceMeterService;
-import org.opencord.olt.internalapi.DeviceBandwidthProfile;
 import org.opencord.sadis.BandwidthProfileInformation;
 import org.opencord.sadis.BaseInformationService;
 import org.opencord.sadis.SadisService;
@@ -695,28 +694,28 @@
             // queue up the meters to be created
             if (upMeterId == null) {
                 log.debug("Missing meter for upstream {}", upstreamBpInfo.id());
-                checkAndCreateDevMeter(new DeviceBandwidthProfile(deviceId, upstreamBpInfo));
+                checkAndCreateDevMeter(deviceId, upstreamBpInfo);
             }
             if (downMeterId == null) {
                 log.debug("Missing meter for downstream {}", downstreamBpInfo.id());
-                checkAndCreateDevMeter(new DeviceBandwidthProfile(deviceId, downstreamBpInfo));
+                checkAndCreateDevMeter(deviceId, downstreamBpInfo);
             }
         }
     }
-    private void checkAndCreateDevMeter(DeviceBandwidthProfile dm) {
-        if (oltMeterService.isMeterPending(dm)) {
-            log.debug("Meter is already pending {}", dm);
+    private void checkAndCreateDevMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        if (oltMeterService.isMeterPending(deviceId, bwpInfo)) {
+            log.debug("Meter is already pending {} on device {}", bwpInfo, deviceId);
             return;
         }
-        oltMeterService.addToPendingMeters(dm);
-        createMeter(dm);
+        oltMeterService.addToPendingMeters(deviceId, bwpInfo);
+        createMeter(deviceId, bwpInfo);
     }
 
-    private void createMeter(DeviceBandwidthProfile dm) {
-        log.debug("Creating Meter {} from queue for subscriber", dm);
+    private void createMeter(DeviceId deviceId, BandwidthProfileInformation bwpInfo) {
+        log.debug("Creating Meter with {} on {} for subscriber", bwpInfo, deviceId);
         CompletableFuture<Object> meterFuture = new CompletableFuture<>();
 
-        MeterId meterId = oltMeterService.createMeter(dm.getDevId(), dm.getBwInfo(),
+        MeterId meterId = oltMeterService.createMeter(deviceId, bwpInfo,
                                                       meterFuture);
 
         meterFuture.thenAcceptAsync(result -> {
@@ -726,12 +725,12 @@
                 SubscriberFlowInfo fi = subsIterator.next();
                 if (result == null) {
                     // meter install sent to device
-                    log.debug("Meter {} installed for bw {}", meterId, dm.getBwInfo());
+                    log.debug("Meter {} installed for bw {} on {}", meterId, bwpInfo, deviceId);
 
                     MeterId upMeterId = oltMeterService
-                            .getMeterIdFromBpMapping(dm.getDevId(), fi.getUpBpInfo());
+                            .getMeterIdFromBpMapping(deviceId, fi.getUpBpInfo());
                     MeterId downMeterId = oltMeterService
-                            .getMeterIdFromBpMapping(dm.getDevId(), fi.getDownBpInfo());
+                            .getMeterIdFromBpMapping(deviceId, fi.getDownBpInfo());
                     if (upMeterId != null && downMeterId != null) {
                         log.debug("Provisioning subscriber after meter {}" +
                                           "installation and both meters are present " +
@@ -746,13 +745,13 @@
                         handleSubFlowsWithMeters(fi);
                         subsIterator.remove();
                     }
-                    oltMeterService.removeFromPendingMeters(new DeviceBandwidthProfile(dm.getDevId(), dm.getBwInfo()));
+                    oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                 } else {
                     // meter install failed
                     log.error("Addition of subscriber {} failed due to meter " +
                                       "{} with result {}", fi, meterId, result);
                     subsIterator.remove();
-                    oltMeterService.removeFromPendingMeters(new DeviceBandwidthProfile(dm.getDevId(), dm.getBwInfo()));
+                    oltMeterService.removeFromPendingMeters(deviceId, bwpInfo);
                 }
             }
         });
@@ -1054,6 +1053,8 @@
                     // on every instance, see how it's done in the InternalDeviceListener
                     // in FlowRuleManager: no mastership check for purgeOnDisconnection
                     flowRuleService.purgeFlowRules(devId);
+                    oltFlowService.clearDeviceState(devId);
+                    oltMeterService.clearDeviceState(devId);
                     return;
                 } else if (!isLocalLeader) {
                     log.debug("Not handling event because instance is not leader for {}", devId);
@@ -1180,6 +1181,11 @@
         private void handleDeviceDisconnection(Device device, boolean sendUniEvent) {
             programmedDevices.remove(device.id());
             removeAllSubscribers(device.id());
+            //Handle case where OLT disconnects during subscriber provisioning
+            pendingSubscribers.removeIf(fi -> fi.getDevId().equals(device.id()));
+            oltFlowService.clearDeviceState(device.id());
+
+            //Complete meter and flow purge
             flowRuleService.purgeFlowRules(device.id());
             oltMeterService.clearMeters(device.id());
             post(new AccessDeviceEvent(