MasteshipService, store, and CLI commands use RoleInfo

Change-Id: Ibc569498a67d33d088e5c9f89c6bb1f45eadc26e
diff --git a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/DistributedMastershipStore.java b/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/DistributedMastershipStore.java
index 28ba049..aaf056c 100644
--- a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/DistributedMastershipStore.java
+++ b/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/DistributedMastershipStore.java
@@ -2,9 +2,6 @@
 
 import static org.onlab.onos.mastership.MastershipEvent.Type.MASTER_CHANGED;
 
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -16,6 +13,7 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.cluster.ClusterService;
 import org.onlab.onos.cluster.NodeId;
+import org.onlab.onos.cluster.RoleInfo;
 import org.onlab.onos.mastership.MastershipEvent;
 import org.onlab.onos.mastership.MastershipStore;
 import org.onlab.onos.mastership.MastershipStoreDelegate;
@@ -161,20 +159,11 @@
 
 
     @Override
-    public List<NodeId> getNodes(DeviceId deviceId) {
-        List<NodeId> nodes = new LinkedList<>();
-
-        //add current master to head - if there is one.
+    public RoleInfo getNodes(DeviceId deviceId) {
         roleMap.lock(deviceId);
         try {
             RoleValue rv = getRoleValue(deviceId);
-            NodeId master = rv.get(MASTER);
-            if (master != null) {
-                nodes.add(master);
-            }
-            //We ignore NONE nodes.
-            nodes.addAll(rv.nodesOfRole(STANDBY));
-            return Collections.unmodifiableList(nodes);
+            return rv.roleInfo();
         } finally {
             roleMap.unlock(deviceId);
         }
diff --git a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/RoleValue.java b/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/RoleValue.java
index 51dd293..1ccee6b 100644
--- a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/RoleValue.java
+++ b/core/store/hz/cluster/src/main/java/org/onlab/onos/store/mastership/impl/RoleValue.java
@@ -7,8 +7,8 @@
 import java.util.Map;
 
 import org.onlab.onos.cluster.NodeId;
+import org.onlab.onos.cluster.RoleInfo;
 import org.onlab.onos.net.MastershipRole;
-import org.onlab.onos.store.common.RoleInfo;
 
 /**
  * A structure that holds node mastership roles associated with a
diff --git a/core/store/hz/common/src/main/java/org/onlab/onos/store/common/RoleInfo.java b/core/store/hz/common/src/main/java/org/onlab/onos/store/common/RoleInfo.java
deleted file mode 100644
index 904488b..0000000
--- a/core/store/hz/common/src/main/java/org/onlab/onos/store/common/RoleInfo.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.onlab.onos.store.common;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
-
-import org.onlab.onos.cluster.NodeId;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A container for detailed role information for a device,
- * within the current cluster. Role attributes include current
- * master and a preference-ordered list of backup nodes.
- */
-public class RoleInfo {
-    private final NodeId master;
-    private final List<NodeId> backups;
-
-    public RoleInfo(NodeId master, List<NodeId> backups) {
-        this.master = master;
-        this.backups = new LinkedList<>();
-
-        this.backups.addAll(checkNotNull(backups));
-    }
-
-    public NodeId master() {
-        return master;
-    }
-
-    public List<NodeId> backups() {
-        return Collections.unmodifiableList(backups);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (other == null) {
-            return false;
-        }
-        if (!(other instanceof RoleInfo)) {
-            return false;
-        }
-        RoleInfo that = (RoleInfo) other;
-        if (!Objects.equals(this.master, that.master)) {
-            return false;
-        }
-        if (!Objects.equals(this.backups, that.backups)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(master, backups.hashCode());
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder builder = new StringBuilder();
-        builder.append("master: \n\t").append(master).append("\n");
-        builder.append("backups: \n");
-        for (NodeId n : backups) {
-            builder.append("\t").append(n).append("\n");
-        }
-        return builder.toString();
-    }
-}
diff --git a/core/store/hz/common/src/test/java/org/onlab/onos/store/common/RoleInfoTest.java b/core/store/hz/common/src/test/java/org/onlab/onos/store/common/RoleInfoTest.java
deleted file mode 100644
index c7e43ff..0000000
--- a/core/store/hz/common/src/test/java/org/onlab/onos/store/common/RoleInfoTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.onlab.onos.store.common;
-
-import java.util.List;
-
-import org.junit.Test;
-import org.onlab.onos.cluster.NodeId;
-
-import com.google.common.collect.Lists;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-/**
- * Test to check behavioral correctness of the RoleInfo structure.
- */
-public class RoleInfoTest {
-    private static final NodeId N1 = new NodeId("n1");
-    private static final NodeId N2 = new NodeId("n2");
-    private static final NodeId N3 = new NodeId("n3");
-    private static final NodeId N4 = new NodeId("n4");
-
-    private static final List<NodeId> BKUP1 = Lists.newArrayList(N2, N3);
-    private static final List<NodeId> BKUP2 = Lists.newArrayList(N3, N4);
-
-    private static final RoleInfo RI1 = new RoleInfo(N1, BKUP1);
-    private static final RoleInfo RI2 = new RoleInfo(N1, BKUP2);
-    private static final RoleInfo RI3 = new RoleInfo(N2, BKUP1);
-
-    @Test
-    public void basics() {
-        assertEquals("wrong master", new NodeId("n1"), RI1.master());
-        System.out.println(RI1.toString());
-        assertEquals("wrong Backups", RI1.backups(), Lists.newArrayList(N2, N3));
-
-        assertNotEquals("equals() broken", RI1, RI2);
-        assertNotEquals("equals() broken", RI1, RI3);
-
-        List<NodeId> bkup3 = Lists.newArrayList(N3, new NodeId("n4"));
-        assertEquals("equals() broken", new RoleInfo(N1, bkup3), RI2);
-    }
-}
diff --git a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java
index f4b035c..fe34959 100644
--- a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java
+++ b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java
@@ -18,6 +18,7 @@
 import org.onlab.onos.cluster.ControllerNode;
 import org.onlab.onos.cluster.DefaultControllerNode;
 import org.onlab.onos.cluster.NodeId;
+import org.onlab.onos.cluster.RoleInfo;
 import org.onlab.onos.mastership.MastershipEvent;
 import org.onlab.onos.mastership.MastershipStore;
 import org.onlab.onos.mastership.MastershipStoreDelegate;
@@ -97,15 +98,11 @@
     }
 
     @Override
-    public List<NodeId> getNodes(DeviceId deviceId) {
+    public RoleInfo getNodes(DeviceId deviceId) {
         List<NodeId> nodes = new ArrayList<>();
-
         nodes.addAll(backups);
-        if (!nodes.contains(masterMap.get(deviceId))) {
-            nodes.add(masterMap.get(deviceId));
-        }
 
-        return Collections.unmodifiableList(nodes);
+        return new RoleInfo(masterMap.get(deviceId), nodes);
     }
 
     @Override