VOL-4511: Logical Meters are not deleted from the kv store after olt
device delete some times

After olt device delete, the logical meters are cleaned up, but before
the logical device could be deleted, ONOS re-installs the meters and
this becomes a stale entry on the KV store.
The fix here is to delay logical meter deletion until logical device
is deleted from the KV store.

Change-Id: I4010da6dead26b481e56ac29d576d8f3e48a936a
diff --git a/rw_core/core/device/logical_agent.go b/rw_core/core/device/logical_agent.go
index f175305..bcc9aef 100644
--- a/rw_core/core/device/logical_agent.go
+++ b/rw_core/core/device/logical_agent.go
@@ -203,12 +203,19 @@
 			logger.Errorw(ctx, "failed-to-send-all-events-on-the-logical-device-before-deletion",
 				log.Fields{"error": err, "logical-device-id": agent.logicalDeviceID})
 		}
+
 		//Remove the logical device from the model
 		if err := agent.ldProxy.Remove(ctx, agent.logicalDeviceID); err != nil {
 			returnErr = err
 		} else {
 			logger.Debugw(ctx, "logical-device-removed", log.Fields{"logical-device-id": agent.logicalDeviceID})
 		}
+
+		if err := agent.ldeviceMgr.deleteAllLogicalMeters(ctx, agent.logicalDeviceID); err != nil {
+			// Just log the error.   The logical device or port may already have been deleted before this callback is invoked.
+			logger.Warnw(ctx, "delete-logical-meters-error", log.Fields{"device-id": agent.logicalDeviceID, "error": err})
+		}
+
 		// TODO: remove all entries from all loaders
 		// TODO: don't allow any more modifications to flows/groups/meters/ports or to any logical device field
 
diff --git a/rw_core/core/device/logical_manager.go b/rw_core/core/device/logical_manager.go
index 8a2a8a8..5e2187d 100644
--- a/rw_core/core/device/logical_manager.go
+++ b/rw_core/core/device/logical_manager.go
@@ -273,10 +273,6 @@
 		return errors.New("device-not-root")
 	}
 	logDeviceID := device.ParentId
-	if err := ldMgr.deleteAllLogicalMeters(ctx, logDeviceID); err != nil {
-		// Just log the error.   The logical device or port may already have been deleted before this callback is invoked.
-		logger.Warnw(ctx, "delete-logical-meters-error", log.Fields{"device-id": logDeviceID, "error": err})
-	}
 	if agent := ldMgr.getLogicalDeviceAgent(ctx, logDeviceID); agent != nil {
 		// Stop the logical device agent
 		if err := agent.stop(ctx); err != nil {