Adding code to enable GUI failover.

Change-Id: I8423f17349411d24332db8670840438d0d8ec8ba
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
index 99ca2e9..dd00d49 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
@@ -16,9 +16,12 @@
 package org.onosproject.ui.impl;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.eclipse.jetty.websocket.WebSocket;
 import org.onlab.osgi.ServiceDirectory;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
 import org.onosproject.ui.UiConnection;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandler;
@@ -99,6 +102,7 @@
         this.connection = connection;
         this.control = (FrameConnection) connection;
         createHandlers();
+        sendInstanceData();
     }
 
     @Override
@@ -143,6 +147,18 @@
         }
     }
 
+    @Override
+    public void sendMessage(String type, long sid, ObjectNode payload) {
+        ObjectNode message = mapper.createObjectNode();
+        message.put("event", type);
+        if (sid > 0) {
+            message.put("sid", sid);
+        }
+        message.set("payload", payload);
+        sendMessage(message);
+
+    }
+
     // Creates new message handlers.
     private void createHandlers() {
         handlers = new HashMap<>();
@@ -163,5 +179,24 @@
         handlers.forEach((type, handler) -> handler.destroy());
         handlers.clear();
     }
+
+    // Sends cluster node/instance information to allow GUI to fail-over.
+    private void sendInstanceData() {
+        ClusterService service = directory.get(ClusterService.class);
+        ArrayNode instances = mapper.createArrayNode();
+
+        for (ControllerNode node : service.getNodes()) {
+            ObjectNode instance = mapper.createObjectNode()
+                    .put("id", node.id().toString())
+                    .put("ip", node.ip().toString())
+                    .put("uiAttached", node.equals(service.getLocalNode()));
+            instances.add(instance);
+        }
+
+        ObjectNode payload = mapper.createObjectNode();
+        payload.set("instances", instances);
+        sendMessage("onosInstances", 0, payload);
+    }
+
 }