Committed by
Gerrit Code Review
ONOS-3326 allow more control over heuristics to select an IP address used for clustering
Change-Id: Ie313efe9249df7581234e7e2e5952cdf3ac43dbb
Showing
1 changed file
with
24 additions
and
7 deletions
| ... | @@ -7,6 +7,7 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -7,6 +7,7 @@ import static org.slf4j.LoggerFactory.getLogger; |
| 7 | import java.io.File; | 7 | import java.io.File; |
| 8 | import java.io.IOException; | 8 | import java.io.IOException; |
| 9 | import java.net.InetAddress; | 9 | import java.net.InetAddress; |
| 10 | +import java.net.Inet4Address; | ||
| 10 | import java.net.NetworkInterface; | 11 | import java.net.NetworkInterface; |
| 11 | import java.util.Arrays; | 12 | import java.util.Arrays; |
| 12 | import java.util.Collection; | 13 | import java.util.Collection; |
| ... | @@ -58,6 +59,7 @@ public class StaticClusterMetadataStore | ... | @@ -58,6 +59,7 @@ public class StaticClusterMetadataStore |
| 58 | 59 | ||
| 59 | private static final String ONOS_IP = "ONOS_IP"; | 60 | private static final String ONOS_IP = "ONOS_IP"; |
| 60 | private static final String ONOS_INTERFACE = "ONOS_INTERFACE"; | 61 | private static final String ONOS_INTERFACE = "ONOS_INTERFACE"; |
| 62 | + private static final String ONOS_ALLOW_IPV6 = "ONOS_ALLOW_IPV6"; | ||
| 61 | private static final String DEFAULT_ONOS_INTERFACE = "eth0"; | 63 | private static final String DEFAULT_ONOS_INTERFACE = "eth0"; |
| 62 | private static final String CLUSTER_METADATA_FILE = "../config/cluster.json"; | 64 | private static final String CLUSTER_METADATA_FILE = "../config/cluster.json"; |
| 63 | private static final int DEFAULT_ONOS_PORT = 9876; | 65 | private static final int DEFAULT_ONOS_PORT = 9876; |
| ... | @@ -214,13 +216,25 @@ public class StaticClusterMetadataStore | ... | @@ -214,13 +216,25 @@ public class StaticClusterMetadataStore |
| 214 | useOnosInterface = DEFAULT_ONOS_INTERFACE; | 216 | useOnosInterface = DEFAULT_ONOS_INTERFACE; |
| 215 | } | 217 | } |
| 216 | 218 | ||
| 219 | + // Capture if they want to limit IP address selection to only IPv4 (default). | ||
| 220 | + boolean allowIPv6 = (System.getenv(ONOS_ALLOW_IPV6) != null); | ||
| 221 | + | ||
| 217 | Function<NetworkInterface, IpAddress> ipLookup = nif -> { | 222 | Function<NetworkInterface, IpAddress> ipLookup = nif -> { |
| 218 | - for (InetAddress address : Collections.list(nif.getInetAddresses())) { | 223 | + IpAddress fallback = null; |
| 219 | - if (address.isSiteLocalAddress()) { | 224 | + |
| 220 | - return IpAddress.valueOf(address); | 225 | + // nif can be null if the interface name specified doesn't exist on the node's host |
| 226 | + if (nif != null) { | ||
| 227 | + for (InetAddress address : Collections.list(nif.getInetAddresses())) { | ||
| 228 | + if (address.isSiteLocalAddress() && (allowIPv6 || address instanceof Inet4Address)) { | ||
| 229 | + return IpAddress.valueOf(address); | ||
| 230 | + } | ||
| 231 | + if (fallback == null && !address.isLoopbackAddress() && !address.isMulticastAddress() | ||
| 232 | + && (allowIPv6 || address instanceof Inet4Address)) { | ||
| 233 | + fallback = IpAddress.valueOf(address); | ||
| 234 | + } | ||
| 221 | } | 235 | } |
| 222 | } | 236 | } |
| 223 | - return null; | 237 | + return fallback; |
| 224 | }; | 238 | }; |
| 225 | try { | 239 | try { |
| 226 | IpAddress ip = ipLookup.apply(NetworkInterface.getByName(useOnosInterface)); | 240 | IpAddress ip = ipLookup.apply(NetworkInterface.getByName(useOnosInterface)); |
| ... | @@ -228,14 +242,17 @@ public class StaticClusterMetadataStore | ... | @@ -228,14 +242,17 @@ public class StaticClusterMetadataStore |
| 228 | return ip.toString(); | 242 | return ip.toString(); |
| 229 | } | 243 | } |
| 230 | for (NetworkInterface nif : Collections.list(getNetworkInterfaces())) { | 244 | for (NetworkInterface nif : Collections.list(getNetworkInterfaces())) { |
| 231 | - ip = ipLookup.apply(nif); | 245 | + if (!nif.getName().equals(useOnosInterface)) { |
| 232 | - if (ip != null) { | 246 | + ip = ipLookup.apply(nif); |
| 233 | - return ip.toString(); | 247 | + if (ip != null) { |
| 248 | + return ip.toString(); | ||
| 249 | + } | ||
| 234 | } | 250 | } |
| 235 | } | 251 | } |
| 236 | } catch (Exception e) { | 252 | } catch (Exception e) { |
| 237 | throw new IllegalStateException("Unable to get network interfaces", e); | 253 | throw new IllegalStateException("Unable to get network interfaces", e); |
| 238 | } | 254 | } |
| 255 | + | ||
| 239 | return IpAddress.valueOf(InetAddress.getLoopbackAddress()).toString(); | 256 | return IpAddress.valueOf(InetAddress.getLoopbackAddress()).toString(); |
| 240 | } | 257 | } |
| 241 | } | 258 | } | ... | ... |
-
Please register or login to post a comment