Support hostname resolution for cluster configuration

Change-Id: I9afb97bfba05366fa63dc7b9022b914bd2d1cce0
(cherry picked from commit 97cd95d5a2a7a1bf1f3bfd3091f2d66f747eee33)
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java b/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java
index e93ce33..d5ef232 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java
@@ -35,7 +35,6 @@
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterMetadata;
 import org.onosproject.cluster.ClusterMetadataProvider;
 import org.onosproject.cluster.ClusterMetadataProviderRegistry;
@@ -126,7 +125,7 @@
     private NodePrototype toPrototype(Node node) {
         NodePrototype prototype = new NodePrototype();
         prototype.setId(node.id().id());
-        prototype.setIp(node.ip().toString());
+        prototype.setHost(node.host());
         prototype.setPort(node.tcpPort());
         return prototype;
     }
@@ -198,6 +197,36 @@
         }
     }
 
+    private static NodeId getNodeId(NodePrototype node) {
+        if (node.getId() != null) {
+            return NodeId.nodeId(node.getId());
+        } else if (node.getHost() != null) {
+            return NodeId.nodeId(node.getHost());
+        } else if (node.getIp() != null) {
+            return NodeId.nodeId(node.getIp());
+        } else {
+            return NodeId.nodeId(UUID.randomUUID().toString());
+        }
+    }
+
+    private static String getNodeHost(NodePrototype node) {
+        if (node.getHost() != null) {
+            return node.getHost();
+        } else if (node.getIp() != null) {
+            return node.getIp();
+        } else {
+            throw new IllegalArgumentException(
+                "Malformed cluster configuration: No host specified for node " + node.getId());
+        }
+    }
+
+    private static int getNodePort(NodePrototype node) {
+        if (node.getPort() != null) {
+            return node.getPort();
+        }
+        return DefaultControllerNode.DEFAULT_PORT;
+    }
+
     private Versioned<ClusterMetadata> fetchMetadata(String metadataUrl) {
         try {
             URL url = new URL(metadataUrl);
@@ -235,30 +264,16 @@
                 metadata.getName(),
                 metadata.getNode() != null ?
                     new DefaultControllerNode(
-                        metadata.getNode().getId() != null
-                            ? NodeId.nodeId(metadata.getNode().getId())
-                            : metadata.getNode().getIp() != null
-                            ? NodeId.nodeId(IpAddress.valueOf(metadata.getNode().getIp()).toString())
-                            : NodeId.nodeId(UUID.randomUUID().toString()),
-                        metadata.getNode().getIp() != null
-                            ? IpAddress.valueOf(metadata.getNode().getIp())
-                            : null,
-                        metadata.getNode().getPort() != null
-                            ? metadata.getNode().getPort()
-                            : DefaultControllerNode.DEFAULT_PORT) : null,
+                        getNodeId(metadata.getNode()),
+                        getNodeHost(metadata.getNode()),
+                        getNodePort(metadata.getNode())) : null,
                     metadata.getController()
                         .stream()
-                        .map(node -> new DefaultControllerNode(
-                            NodeId.nodeId(node.getId()),
-                            IpAddress.valueOf(node.getIp()),
-                            node.getPort() != null ? node.getPort() : 5679))
+                        .map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node)))
                         .collect(Collectors.toSet()),
                     metadata.getStorage()
                         .stream()
-                        .map(node -> new DefaultControllerNode(
-                            NodeId.nodeId(node.getId()),
-                            IpAddress.valueOf(node.getIp()),
-                            node.getPort() != null ? node.getPort() : 5679))
+                        .map(node -> new DefaultControllerNode(getNodeId(node), getNodeHost(node), getNodePort(node)))
                         .collect(Collectors.toSet())),
                 version);
         } catch (IOException e) {
@@ -329,6 +344,7 @@
     private static class NodePrototype {
         private String id;
         private String ip;
+        private String host;
         private Integer port;
 
         public String getId() {
@@ -347,6 +363,14 @@
             this.ip = ip;
         }
 
+        public String getHost() {
+            return host;
+        }
+
+        public void setHost(String host) {
+            this.host = host;
+        }
+
         public Integer getPort() {
             return port;
         }