ConsistentDeviceMastership on top of LeadershipService, and leaders CLI command
modified to filter on topic. This does not support changing candidate ordering
(yet).

Refernce: ONOS-76

Change-Id: I028a6df0acbe3c4e4ff7c228f687f640e48e13be
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java
index 303129d..ed610ad 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java
@@ -362,8 +362,8 @@
         Leadership newInfo = new Leadership(path, candidates, epoch, electedTime);
         final MutableBoolean updated = new MutableBoolean(false);
         candidateBoard.compute(path, (k, current) -> {
-            if (current != null && current.epoch() == newInfo.epoch()) {
-                log.info("updating candidateboard with {}", newInfo);
+            if (current != null && current.epoch() <= newInfo.epoch()) {
+                log.info("updating candidateboard with removal of {}", newInfo);
                 updated.setTrue();
                 if (candidates.isEmpty()) {
                     return null;
@@ -452,7 +452,7 @@
                 });
             } else if (eventType.equals(LeadershipEvent.Type.LEADER_BOOTED)) {
                 leaderBoard.compute(topic, (k, currentLeadership) -> {
-                    if (currentLeadership == null || currentLeadership.epoch() < leadershipUpdate.epoch()) {
+                    if (currentLeadership == null || currentLeadership.epoch() == leadershipUpdate.epoch()) {
                         updateAccepted.setTrue();
                         return null;
                     }
@@ -462,6 +462,9 @@
                 candidateBoard.compute(topic, (k, currentInfo) -> {
                     if (currentInfo == null || currentInfo.epoch() <= leadershipUpdate.epoch()) {
                         updateAccepted.setTrue();
+                        if (leadershipUpdate.candidates().isEmpty()) {
+                            return null;
+                        }
                         return leadershipUpdate;
                     }
                     return currentInfo;