Added ability to force mastership re-balancing between instances from the GUI.

Change-Id: I98e56deb3e2b00df630ed85b596c8e35b3d6efab
diff --git a/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java b/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
index 84e2e02..7477e60 100644
--- a/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
+++ b/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
@@ -27,6 +27,7 @@
 import org.onlab.onos.event.AbstractEventAccumulator;
 import org.onlab.onos.event.Event;
 import org.onlab.onos.event.EventAccumulator;
+import org.onlab.onos.mastership.MastershipAdminService;
 import org.onlab.onos.mastership.MastershipEvent;
 import org.onlab.onos.mastership.MastershipListener;
 import org.onlab.onos.net.ConnectPoint;
@@ -233,6 +234,9 @@
             requestSummary(event);
         } else if (type.equals("cancelSummary")) {
             cancelSummary(event);
+
+        } else if (type.equals("equalizeMasters")) {
+            equalizeMasters(event);
         }
     }
 
@@ -449,6 +453,12 @@
     }
 
 
+    // Forces mastership role rebalancing.
+    private void equalizeMasters(ObjectNode event) {
+        directory.get(MastershipAdminService.class).balanceRoles();
+    }
+
+
     // Adds all internal listeners.
     private void addListeners() {
         clusterService.addListener(clusterListener);
diff --git a/web/gui/src/main/webapp/d3Utils.js b/web/gui/src/main/webapp/d3Utils.js
index 33bba5a..0161459 100644
--- a/web/gui/src/main/webapp/d3Utils.js
+++ b/web/gui/src/main/webapp/d3Utils.js
@@ -140,12 +140,12 @@
     // TODO: tune colors for light and dark themes
     // Note: These colors look good on the white background. Still, need to tune for dark.
 
-    //               blue       brown      purple     sea green  brick red  dark teal  lime
-    var lightNorm = ['#3E5780', '#78533B', '#8A2979', '#018D61', '#CB4D28', '#006D73', '#56AF00'],
-        lightMute = ['#A8B8CC', '#CCB3A8', '#D19FCE', '#96D6BF', '#FFC2BD', '#8FCCCA', '#CAEAA4'],
+    //               blue       brown      brick red  sea green  purple     dark teal  lime
+    var lightNorm = ['#3E5780', '#78533B', '#CB4D28', '#018D61', '#8A2979', '#006D73', '#56AF00'],
+        lightMute = ['#A8B8CC', '#CCB3A8', '#FFC2BD', '#96D6BF', '#D19FCE', '#8FCCCA', '#CAEAA4'],
 
-        darkNorm  = ['#3E5780', '#78533B', '#8A2979', '#018D61', '#CB4D28', '#006D73', '#56AF00'],
-        darkMute  = ['#A8B8CC', '#CCB3A8', '#D19FCE', '#96D6BF', '#FFC2BD', '#8FCCCA', '#CAEAA4'];
+        darkNorm  = ['#3E5780', '#78533B', '#CB4D28', '#018D61', '#8A2979', '#006D73', '#56AF00'],
+        darkMute  = ['#A8B8CC', '#CCB3A8', '#FFC2BD', '#96D6BF', '#D19FCE', '#8FCCCA', '#CAEAA4'];
 
     function cat7() {
         var colors = {
diff --git a/web/gui/src/main/webapp/onos.js b/web/gui/src/main/webapp/onos.js
index 53d68f6..5dfcad1 100644
--- a/web/gui/src/main/webapp/onos.js
+++ b/web/gui/src/main/webapp/onos.js
@@ -97,6 +97,7 @@
                 case 187: return 'equals';
                 case 189: return 'dash';
                 case 191: return 'slash';
+                case 192: return 'backQuote';
                 default:
                     if ((code >= 48 && code <= 57) ||
                         (code >= 65 && code <= 90)) {
diff --git a/web/gui/src/main/webapp/onosQuickHelp.js b/web/gui/src/main/webapp/onosQuickHelp.js
index 596276b..9e2a5ec 100644
--- a/web/gui/src/main/webapp/onosQuickHelp.js
+++ b/web/gui/src/main/webapp/onosQuickHelp.js
@@ -55,6 +55,7 @@
         equals: '=',
         dash: '-',
         slash: '/',
+        backQuote: '`',
         leftArrow: 'L-arrow',
         upArrow: 'U-arrow',
         rightArrow: 'R-arrow',
diff --git a/web/gui/src/main/webapp/topo.js b/web/gui/src/main/webapp/topo.js
index 6673b28..4018757 100644
--- a/web/gui/src/main/webapp/topo.js
+++ b/web/gui/src/main/webapp/topo.js
@@ -140,6 +140,7 @@
         equals: injectStartupEvents,
         dash: injectTestEvent,
 
+        E: [equalizeMasters, 'Equalize mastership roles'],
         O: [toggleSummary, 'Toggle ONOS summary pane'],
         I: [toggleInstances, 'Toggle ONOS instances pane'],
         D: [toggleDetails, 'Disable / enable details pane'],
@@ -926,6 +927,11 @@
         updateDeviceColors();
     }
 
+    function equalizeMasters() {
+        flash('Equalizing master roles');
+        sendMessage('equalizeMasters');
+    }
+
     function toggleSummary() {
         if (!summaryPane.isVisible()) {
             requestSummary();