Hi!

For when 127.0.0.1 is not there, soon to be.  Roots out one last piece of
IPv4 only in openstack.

Please find patch attached.

Thoughts please about approach.

Github repo is here:
https://github.com/grantma/deb-python-eventlet/tree/full-ipv6-defaults

Thank you!

Best Regards,

Matt Grant
diff --git a/eventlet/support/afinet.py b/eventlet/support/afinet.py
new file mode 100644
index 0000000..5c48b0f
--- /dev/null
+++ b/eventlet/support/afinet.py
@@ -0,0 +1,46 @@
+"""
+Test availabilty of AF_INET6 on a machine
+
+Uses socket API to determine configuration
+"""
+
+from socket import *
+
+def check_ipv6_lo_addr():
+    try:
+        sock = socket(AF_INET6, SOCK_STREAM)
+        sock.bind(('::1', 0))
+        return True
+    except:
+        return False
+
+def check_ipv6_hosts_file():
+    if not check_ipv6_lo_addr():
+        return False
+    addrinfo = getaddrinfo(gethostname(), 0)
+    if (addrinfo[0][0] == AF_INET6):
+        return True
+    return False
+
+core_use_ipv6_lo_addr = check_ipv6_lo_addr()
+use_ipv6_by_default = check_ipv6_hosts_file()
+
+ip_defaults = {}
+
+if core_use_ipv6_lo_addr:
+    ip_defaults['core_lo_addr'] = '::1'
+    ip_defaults['core_af_inet'] = AF_INET6
+else:
+    ip_defaults['core_lo_addr'] = '127.0.0.1'
+    ip_defaults['core_af_inet'] = AF_INET
+
+if use_ipv6_by_default:
+    ip_defaults['af_inet'] = AF_INET6
+    ip_defaults['null_addr'] = '::'
+    ip_defaults['null_cidr'] = '::/0'
+    ip_defaults['lo_addr'] = '::1'
+else:
+    ip_defaults['af_inet'] = AF_INET
+    ip_defaults['null_addr'] = '0.0.0.0'
+    ip_defaults['null_cidr'] = '0.0.0.0/0'
+    ip_defaults['lo_addr'] = '127.0.0.1'
diff --git a/eventlet/backdoor.py b/eventlet/backdoor.py
index 9a6797a..a282e2a 100644
--- a/eventlet/backdoor.py
+++ b/eventlet/backdoor.py
@@ -10,6 +10,7 @@ import traceback
 import eventlet
 from eventlet import hubs
 from eventlet.support import greenlets, get_errno
+from eventlet.support.afinet import ip_defaults
 
 try:
     sys.ps1
@@ -133,4 +134,4 @@ def backdoor(conn_info, locals=None):
 
 
 if __name__ == '__main__':
-    backdoor_server(eventlet.listen(('127.0.0.1', 9000)), {})
+    backdoor_server(eventlet.listen((ip_defaults['core_lo_addr'], 9000)), {})
diff --git a/eventlet/convenience.py b/eventlet/convenience.py
index 88343a9..8c26c27 100644
--- a/eventlet/convenience.py
+++ b/eventlet/convenience.py
@@ -5,9 +5,10 @@ from eventlet import greenpool
 from eventlet import greenthread
 from eventlet.green import socket
 from eventlet.support import greenlets as greenlet
+from eventlet.support.afinet import ip_defaults
 
 
-def connect(addr, family=socket.AF_INET, bind=None):
+def connect(addr, family=ip_defaults['af_inet'], bind=None):
     """Convenience function for opening client sockets.
 
     :param addr: Address of the server to connect to.  For TCP sockets, this is a (host, port) tuple.
@@ -22,7 +23,7 @@ def connect(addr, family=socket.AF_INET, bind=None):
     return sock
 
 
-def listen(addr, family=socket.AF_INET, backlog=50):
+def listen(addr, family=ip_defaults['af_inet'], backlog=50):
     """Convenience function for opening server sockets.  This
     socket can be used in :func:`~eventlet.serve` or a custom ``accept()`` loop.
 
diff --git a/eventlet/greenio/base.py b/eventlet/greenio/base.py
index 042f7d8..ee2950f 100644
--- a/eventlet/greenio/base.py
+++ b/eventlet/greenio/base.py
@@ -8,6 +8,7 @@ import warnings
 import eventlet
 from eventlet.hubs import trampoline, notify_opened, IOClosed
 from eventlet.support import get_errno, six
+from eventlet.support.afinet import ip_defaults
 
 __all__ = [
     'GreenSocket', '_GLOBAL_DEFAULT_TIMEOUT', 'set_nonblocking',
@@ -129,7 +130,7 @@ class GreenSocket(object):
     # This placeholder is to prevent __getattr__ from creating an infinite call loop
     fd = None
 
-    def __init__(self, family=socket.AF_INET, *args, **kwargs):
+    def __init__(self, family=ip_defaults['af_inet'], *args, **kwargs):
         should_set_nonblocking = kwargs.pop('set_nonblocking', True)
         if isinstance(family, six.integer_types):
             fd = _original_socket(family, *args, **kwargs)
diff --git a/eventlet/support/greendns.py b/eventlet/support/greendns.py
index 8d5c7d6..eb9075c 100644
--- a/eventlet/support/greendns.py
+++ b/eventlet/support/greendns.py
@@ -41,6 +41,8 @@ from eventlet.green import os
 from eventlet.green import time
 from eventlet.green import select
 from eventlet.support import six
+from eventlet.support.afinet import ip_defaults
+from eventlet.support.afinet import use_ipv6_by_default
 
 
 def import_patched(module_name):
@@ -72,6 +74,11 @@ for pkg in dns.rdtypes.ANY.__all__:
 del import_patched
 sys.path.pop(0)
 
+# Done here to prevent import nesting errors
+if use_ipv6_by_default:
+    def_rdtype = dns.rdatatype.AAAA
+else:
+    def_rdtype = dns.rdatatype.A
 
 socket = _socket_nodns
 
@@ -302,7 +309,7 @@ class ResolverProxy(object):
         self._resolver = dns.resolver.Resolver(filename=self._filename)
         self._resolver.cache = dns.resolver.LRUCache()
 
-    def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
+    def query(self, qname, rdtype=def_rdtype, rdclass=dns.rdataclass.IN,
               tcp=False, source=None, raise_on_no_answer=True,
               _hosts_rdtypes=(dns.rdatatype.A, dns.rdatatype.AAAA)):
         """Query the resolver, using /etc/hosts if enabled.
@@ -310,7 +317,7 @@ class ResolverProxy(object):
         result = [None, None, 0]
 
         if qname is None:
-            qname = '0.0.0.0'
+            qname = ip_defaults['null_addr']
         if isinstance(qname, six.string_types):
             qname = dns.name.from_text(qname, None)
 
@@ -376,7 +383,7 @@ class ResolverProxy(object):
 resolver = ResolverProxy(hosts_resolver=HostsResolver())
 
 
-def resolve(name, family=socket.AF_INET, raises=True):
+def resolve(name, family=ip_defaults['af_inet'], raises=True):
     """Resolve a name for a given family using the global resolver proxy
 
     This method is called by the global getaddrinfo() function.
diff --git a/eventlet/tpool.py b/eventlet/tpool.py
index 1c2dea0..cbb9b91 100644
--- a/eventlet/tpool.py
+++ b/eventlet/tpool.py
@@ -22,6 +22,7 @@ import traceback
 import eventlet
 from eventlet import event, greenio, greenthread, patcher, timeout
 from eventlet.support import six
+from eventlet.support.afinet import ip_defaults
 
 __all__ = ['execute', 'Proxy', 'killall', 'set_num_threads']
 
@@ -269,10 +270,10 @@ def setup():
     _rspq = Queue(maxsize=-1)
 
     # connected socket pair
-    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    sock.bind(('127.0.0.1', 0))
+    sock = socket.socket(ip_defaults['core_af_inet'], socket.SOCK_STREAM)
+    sock.bind((ip_defaults['core_lo_addr'], 0))
     sock.listen(1)
-    csock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    csock = socket.socket(ip_defaults['core_af_inet'], socket.SOCK_STREAM)
     csock.connect(sock.getsockname())
     csock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)
     _wsock, _addr = sock.accept()
__________________________________________________________________________
OpenStack Development Mailing List (not for usage questions)
Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to