Upgrade to Atomix 3.0-rc5
* Upgrade Raft primitives to Atomix 3.0
* Replace cluster store and messaging implementations with Atomix cluster management/messaging
* Add test scripts for installing/starting Atomix cluster
* Replace core primitives with Atomix primitives.

Change-Id: I7623653c81292a34f21b01f5f38ca11b5ef15cad
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java
index 75e6f3f..347c812 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java
@@ -15,6 +15,15 @@
  */
 package org.onosproject.cluster.impl;
 
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -29,6 +38,7 @@
 import org.onosproject.cluster.ClusterMetadataProviderService;
 import org.onosproject.cluster.ClusterMetadataService;
 import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.DefaultControllerNode;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cluster.PartitionId;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
@@ -36,14 +46,6 @@
 import org.onosproject.store.service.Versioned;
 import org.slf4j.Logger;
 
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Enumeration;
-
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.CLUSTER_READ;
@@ -96,7 +98,20 @@
     public ControllerNode getLocalNode() {
         checkPermission(CLUSTER_READ);
         if (localNode == null) {
-            establishSelfIdentity();
+            ControllerNode localNode = getProvider().getClusterMetadata().value().getLocalNode();
+            try {
+                if (localNode != null) {
+                    this.localNode = new DefaultControllerNode(
+                        localNode.id(),
+                        localNode.ip() != null ? localNode.ip() : findLocalIp(),
+                        localNode.tcpPort());
+                } else {
+                    IpAddress ip = findLocalIp();
+                    this.localNode = new DefaultControllerNode(NodeId.nodeId(ip.toString()), ip);
+                }
+            } catch (SocketException e) {
+                throw new IllegalStateException(e);
+            }
         }
         return localNode;
     }
@@ -141,37 +156,32 @@
         }
     }
 
-    private IpAddress findLocalIp(Collection<ControllerNode> controllerNodes) throws SocketException {
-        Enumeration<NetworkInterface> interfaces =
-                NetworkInterface.getNetworkInterfaces();
+    private IpAddress findLocalIp() throws SocketException {
+        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
         while (interfaces.hasMoreElements()) {
             NetworkInterface iface = interfaces.nextElement();
+            if (iface.isLoopback() || iface.isPointToPoint()) {
+                continue;
+            }
+
             Enumeration<InetAddress> inetAddresses = iface.getInetAddresses();
             while (inetAddresses.hasMoreElements()) {
-                IpAddress ip = IpAddress.valueOf(inetAddresses.nextElement());
-                if (controllerNodes.stream()
-                        .map(ControllerNode::ip)
-                        .anyMatch(nodeIp -> ip.equals(nodeIp))) {
-                    return ip;
+                InetAddress inetAddress = inetAddresses.nextElement();
+                if (inetAddress instanceof Inet4Address) {
+                    Inet4Address inet4Address = (Inet4Address) inetAddress;
+                    try {
+                        if (!inet4Address.getHostAddress().equals(InetAddress.getLocalHost().getHostAddress())) {
+                            return IpAddress.valueOf(inetAddress);
+                        }
+                    } catch (UnknownHostException e) {
+                        return IpAddress.valueOf(inetAddress);
+                    }
                 }
             }
         }
         throw new IllegalStateException("Unable to determine local ip");
     }
 
-    private void establishSelfIdentity() {
-        try {
-            IpAddress ip = findLocalIp(getClusterMetadata().getNodes());
-            localNode = getClusterMetadata().getNodes()
-                                            .stream()
-                                            .filter(node -> node.ip().equals(ip))
-                                            .findFirst()
-                                            .get();
-        } catch (SocketException e) {
-            throw new IllegalStateException("Cannot determine local IP", e);
-        }
-    }
-
     private class InternalClusterMetadataProviderService
             extends AbstractProviderService<ClusterMetadataProvider>
             implements ClusterMetadataProviderService {