Description: Replace dnspython "_compute_expiration" by "_compute_times".
 In dnspython v2.0.0, "_compute_expiration" was replaced by
 "_compute_times". Once the minimum version of dnspython is
 v2.0.0, we can remove this wrapping method.
Author: Rodolfo Alonso Hernandez <ralonsoh@redhat.com>
Date: Mon, 20 Jul 2020 17:21:30 +0000
Closes-Bug: #1888258
Fixes: #629
Origin: https://github.com/eventlet/eventlet/commit/46fc185c8f92008c65aef2713fc1445bfc5f6fec

diff --git a/eventlet/support/greendns.py b/eventlet/support/greendns.py
index 13968c2c1..19b83c99c 100644
--- a/eventlet/support/greendns.py
+++ b/eventlet/support/greendns.py
@@ -118,6 +118,15 @@ def is_ip_addr(host):
     return is_ipv4_addr(host) or is_ipv6_addr(host)
 
 
+def compute_expiration(query, timeout):
+    # NOTE(ralonsoh): in dnspython v2.0.0, "_compute_expiration" was replaced
+    # by "_compute_times".
+    if hasattr(query, '_compute_expiration'):
+        return query._compute_expiration(timeout)
+    else:
+        return query._compute_times(timeout)[1]
+
+
 class HostsAnswer(dns.resolver.Answer):
     """Answer class for HostsResolver object"""
 
@@ -709,7 +718,7 @@ def udp(q, where, timeout=DNS_QUERY_TIMEOUT, port=53,
     s = socket.socket(af, socket.SOCK_DGRAM)
     s.settimeout(timeout)
     try:
-        expiration = dns.query._compute_expiration(timeout)
+        expiration = compute_expiration(dns.query, timeout)
         if source is not None:
             s.bind(source)
         while True:
@@ -802,7 +811,7 @@ def tcp(q, where, timeout=DNS_QUERY_TIMEOUT, port=53,
     s = socket.socket(af, socket.SOCK_STREAM)
     s.settimeout(timeout)
     try:
-        expiration = dns.query._compute_expiration(timeout)
+        expiration = compute_expiration(dns.query, timeout)
         if source is not None:
             s.bind(source)
         while True:
