Relinquish mastership, tests, and few modifications to trivial MastershipStore

Change-Id: Iae29de010f13cb3ee02bcb316510cc254d5756fc
diff --git a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
index 2b9b048..8dd3379 100644
--- a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
+++ b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
@@ -72,9 +72,20 @@
         checkNotNull(nodeId, NODE_ID_NULL);
         checkNotNull(deviceId, DEVICE_ID_NULL);
         checkNotNull(role, ROLE_NULL);
-        //TODO figure out appropriate action for non-MASTER roles, if we even set those
-        if (role.equals(MastershipRole.MASTER)) {
-            MastershipEvent event = store.setMaster(nodeId, deviceId);
+
+        MastershipRole current = store.getRole(nodeId, deviceId);
+        if (role.equals(current)) {
+            return;
+        } else {
+            MastershipEvent event = null;
+            if (role.equals(MastershipRole.MASTER)) {
+                //current was STANDBY, wanted MASTER
+                event = store.setMaster(nodeId, deviceId);
+            } else {
+                //current was MASTER, wanted STANDBY
+                event = store.unsetMaster(nodeId, deviceId);
+            }
+
             if (event != null) {
                 post(event);
             }
@@ -90,7 +101,18 @@
     @Override
     public void relinquishMastership(DeviceId deviceId) {
         checkNotNull(deviceId, DEVICE_ID_NULL);
-        // FIXME: add method to store to give up mastership and trigger new master selection process
+
+        MastershipRole role = store.getRole(
+                clusterService.getLocalNode().id(), deviceId);
+        if (!role.equals(MastershipRole.MASTER)) {
+            return;
+        }
+
+        MastershipEvent event = store.unsetMaster(
+                clusterService.getLocalNode().id(), deviceId);
+        if (event != null) {
+            post(event);
+        }
     }
 
     @Override
@@ -159,10 +181,6 @@
                      break;
                 case INSTANCE_REMOVED:
                 case INSTANCE_DEACTIVATED:
-                    for (DeviceId d : getDevicesOf(event.subject().id())) {
-                        //this method should be an admin iface?
-                        relinquishMastership(d);
-                    }
                     break;
                 default:
                     log.warn("unknown cluster event {}", event);