summaryrefslogtreecommitdiffstats
path: root/nova/utils.py
diff options
context:
space:
mode:
authorDavanum Srinivas <dims@linux.vnet.ibm.com>2013-06-25 08:54:53 -0400
committerDavanum Srinivas <dims@linux.vnet.ibm.com>2013-06-26 15:10:39 -0400
commit7b97d363524fbd471289070557d1b8ffe9c06758 (patch)
tree87490a1ef02bd69e0c80e3720923869549253196 /nova/utils.py
parent922e7306a4b0a5222d6f4175e021108c05f008bf (diff)
downloadnova-7b97d363524fbd471289070557d1b8ffe9c06758.tar.gz
nova-7b97d363524fbd471289070557d1b8ffe9c06758.tar.xz
nova-7b97d363524fbd471289070557d1b8ffe9c06758.zip
Better default for my_ip if 8.8.8.8 is unreachable
Run if route/show, extract ipv4 addresses and pick the first one. Fall back to 127.0.0.1 as before if we don't find anything or if we have running the ip route/show commands Fixes LP# 1193013 Change-Id: If73f0f6bf67f858f7506220debab0f74cc9e3cb4
Diffstat (limited to 'nova/utils.py')
-rw-r--r--nova/utils.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/nova/utils.py b/nova/utils.py
index 5e968bd35..20dc51a79 100644
--- a/nova/utils.py
+++ b/nova/utils.py
@@ -321,6 +321,62 @@ def last_octet(address):
return int(address.split('.')[-1])
+def get_my_ipv4_address():
+ """Run ip route/addr commands to figure out the best ipv4
+ """
+ LOCALHOST = '127.0.0.1'
+ try:
+ out = execute('ip', '-f', 'inet', '-o', 'route', 'show',
+ run_as_root=True)
+
+ # Find the default route
+ regex_default = ('default\s*via\s*'
+ '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
+ '\s*dev\s*(\w*)\s*')
+ default_routes = re.findall(regex_default, out[0])
+ if not default_routes:
+ return LOCALHOST
+ gateway, iface = default_routes[0]
+
+ # Find the right subnet for the gateway/interface for
+ # the default route
+ route = ('(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/(\d{1,2})'
+ '\s*dev\s*(\w*)\s*')
+ for match in re.finditer(route, out[0]):
+ subnet = netaddr.IPNetwork(match.group(1) + "/" + match.group(2))
+ if (match.group(3) == iface and
+ netaddr.IPAddress(gateway) in subnet):
+ try:
+ return _get_ipv4_address_for_interface(iface)
+ except exception.NovaException:
+ pass
+ except Exception as ex:
+ LOG.error(_("Couldn't get IPv4 : %(ex)s") % {'ex': ex})
+ return LOCALHOST
+
+
+def _get_ipv4_address_for_interface(iface):
+ """Run ip addr show for an interface and grab its ipv4 addresses
+ """
+ try:
+ out = execute('ip', '-f', 'inet', '-o', 'addr', 'show', iface,
+ run_as_root=True)
+ regexp_address = re.compile('inet\s*'
+ '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
+ address = [m.group(1) for m in regexp_address.finditer(out[0])
+ if m.group(1) != '127.0.0.1']
+ if address:
+ return address[0]
+ else:
+ msg = _('IPv4 address is not found.: %s') % out[0]
+ raise exception.NovaException(msg)
+ except Exception as ex:
+ msg = _("Couldn't get IPv4 of %(interface)s"
+ " : %(ex)s") % {'interface': iface, 'ex': ex}
+ LOG.error(msg)
+ raise exception.NovaException(msg)
+
+
def get_my_linklocal(interface):
try:
if_str = execute('ip', '-f', 'inet6', '-o', 'addr', 'show', interface)