[SDFAB-753] Improve ONOS cluster event

Main idea of this change is to add an additional parameter
in the event that carries information about the failed instance.

Additionally, prevents several NPE by using hostname as id
when controller hostname cannot be resolved into an ip.

Change-Id: Id9886afe3f1e5ecee0f1414b2722c340680a813e
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
index 980d7f6..7243818 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
@@ -19,6 +19,7 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
+import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.NodeId;
@@ -170,27 +171,31 @@
 
         @Override
         public void process(ObjectNode payload) {
+            ObjectNode rootNode = objectNode();
+            ObjectNode data = objectNode();
+            ArrayNode devices = arrayNode();
 
             String id = string(payload, ID);
             ClusterService cs = get(ClusterService.class);
             ControllerNode node = cs.getNode(new NodeId(id));
+            if (node != null) {
+                IpAddress nodeIp = node.ip();
+                List<Device> deviceList = populateDevices(node);
 
-            ObjectNode data = objectNode();
-            ArrayNode devices = arrayNode();
-            List<Device> deviceList = populateDevices(node);
+                data.put(ID, node.id().toString());
+                data.put(IP, nodeIp != null ? nodeIp.toString() : node.host());
 
-            data.put(ID, node.id().toString());
-            data.put(IP, node.ip().toString());
+                for (Device d : deviceList) {
+                    devices.add(deviceData(d));
+                }
 
-            for (Device d : deviceList) {
-                devices.add(deviceData(d));
+            } else {
+                data.put(ID, "NONE");
+                data.put(IP, "NONE");
             }
-
             data.set(DEVICES, devices);
 
             //TODO put more detail info to data
-
-            ObjectNode rootNode = objectNode();
             rootNode.set(DETAILS, data);
             sendMessage(CLUSTER_DETAILS_RESP, rootNode);
         }