mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge branch '2019.2.1' into 54741_run_job_fails_without_time_element
This commit is contained in:
commit
3ae4f75788
32 changed files with 132 additions and 99 deletions
6
doc/topics/releases/2019.2.2.rst
Normal file
6
doc/topics/releases/2019.2.2.rst
Normal file
|
@ -0,0 +1,6 @@
|
|||
========================================
|
||||
In Progress: Salt 2019.2.2 Release Notes
|
||||
========================================
|
||||
|
||||
Version 2019.2.2 is an **unreleased** bugfix release for :ref:`2019.2.0 <release-2019-2-0>`.
|
||||
This release is still in progress and has not been released yet.
|
|
@ -60,7 +60,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -60,7 +60,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -56,7 +56,7 @@ kubernetes==3.0.0
|
|||
libnacl==1.6.1
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -60,7 +60,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -60,7 +60,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -59,7 +59,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -59,7 +59,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -60,7 +60,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -60,7 +60,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -57,7 +57,7 @@ kubernetes==3.0.0
|
|||
libnacl==1.6.1
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -65,7 +65,7 @@ lxml==4.3.3 # via junos-eznc, ncclient
|
|||
mako==1.0.7
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -59,7 +59,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -59,7 +59,7 @@ libnacl==1.6.1
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -60,7 +60,7 @@ lxml==4.3.0
|
|||
mako==1.0.7
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -58,7 +58,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -58,7 +58,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -54,7 +54,7 @@ keyring==5.7.1
|
|||
kubernetes==3.0.0
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -58,7 +58,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -58,7 +58,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -57,7 +57,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -57,7 +57,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -58,7 +58,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -58,7 +58,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -55,7 +55,7 @@ keyring==5.7.1
|
|||
kubernetes==3.0.0
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -63,7 +63,7 @@ lxml==4.3.3 # via junos-eznc, ncclient
|
|||
mako==1.0.7
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -57,7 +57,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -57,7 +57,7 @@ kubernetes==3.0.0
|
|||
lxml==4.3.3 # via junos-eznc, ncclient
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
|
@ -59,7 +59,7 @@ lxml==4.3.0
|
|||
mako==1.0.7
|
||||
markupsafe==1.1.1
|
||||
meld3==1.0.2 # via supervisor
|
||||
mock==2.0.0 ; python_version < "3.6"
|
||||
mock==3.0.5 ; python_version < "3.6"
|
||||
more-itertools==5.0.0
|
||||
moto==1.3.7
|
||||
msgpack-python==0.5.6
|
||||
|
|
4
salt/metaproxy/__init__.py
Normal file
4
salt/metaproxy/__init__.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
Metaproxy Directory
|
||||
'''
|
|
@ -1899,61 +1899,25 @@ def refresh_dns():
|
|||
@jinja_filter('dns_check')
|
||||
def dns_check(addr, port, safe=False, ipv6=None):
|
||||
'''
|
||||
Return the ip resolved by dns, but do not exit on failure, only raise an
|
||||
exception. Obeys system preference for IPv4/6 address resolution - this
|
||||
can be overridden by the ipv6 flag.
|
||||
Tries to connect to the address before considering it useful. If no address
|
||||
can be reached, the first one resolved is used as a fallback.
|
||||
Return an ip address resolved by dns in a format usable in URLs (ipv6 in brackets).
|
||||
Obeys system preference for IPv4/6 address resolution - this can be overridden by
|
||||
the ipv6 flag. Tries to connect to the address before considering it useful. If no
|
||||
address can be reached, the first one resolved is used as a fallback.
|
||||
Does not exit on failure, raises an exception.
|
||||
'''
|
||||
error = False
|
||||
lookup = addr
|
||||
seen_ipv6 = False
|
||||
ip_addrs = []
|
||||
family = socket.AF_INET6 if ipv6 else socket.AF_INET if ipv6 is False else socket.AF_UNSPEC
|
||||
try:
|
||||
refresh_dns()
|
||||
hostnames = socket.getaddrinfo(addr, port, family, socket.SOCK_STREAM)
|
||||
if not hostnames:
|
||||
error = True
|
||||
else:
|
||||
resolved = False
|
||||
candidates = []
|
||||
for h in hostnames:
|
||||
# Input is IP address, passed through unchanged, just return it
|
||||
if h[4][0] == addr:
|
||||
resolved = salt.utils.zeromq.ip_bracket(addr)
|
||||
break
|
||||
|
||||
if h[0] == socket.AF_INET and ipv6 is True:
|
||||
continue
|
||||
if h[0] == socket.AF_INET6 and ipv6 is False:
|
||||
continue
|
||||
|
||||
candidate_addr = h[4][0]
|
||||
|
||||
if h[0] != socket.AF_INET6 or ipv6 is not None:
|
||||
candidates.append(candidate_addr)
|
||||
|
||||
try:
|
||||
s = socket.socket(h[0], socket.SOCK_STREAM)
|
||||
s.connect((candidate_addr, port))
|
||||
s.close()
|
||||
|
||||
resolved = candidate_addr
|
||||
break
|
||||
except socket.error:
|
||||
pass
|
||||
if not resolved:
|
||||
if len(candidates) > 0:
|
||||
resolved = candidates[0]
|
||||
else:
|
||||
error = True
|
||||
addrinfo = socket.getaddrinfo(addr, port, family, socket.SOCK_STREAM)
|
||||
ip_addrs = _test_addrs(addrinfo, port)
|
||||
except TypeError:
|
||||
err = ('Attempt to resolve address \'{0}\' failed. Invalid or unresolveable address').format(lookup)
|
||||
err = ('Attempt to resolve address \'{0}\' failed. Invalid or unresolveable address').format(addr)
|
||||
raise SaltSystemExit(code=42, msg=err)
|
||||
except socket.error:
|
||||
error = True
|
||||
pass
|
||||
|
||||
if error:
|
||||
if not ip_addrs:
|
||||
err = ('DNS lookup or connection check of \'{0}\' failed.').format(addr)
|
||||
if safe:
|
||||
if salt.log.is_console_configured():
|
||||
|
@ -1963,7 +1927,34 @@ def dns_check(addr, port, safe=False, ipv6=None):
|
|||
log.error(err)
|
||||
raise SaltClientError()
|
||||
raise SaltSystemExit(code=42, msg=err)
|
||||
return resolved
|
||||
|
||||
return salt.utils.zeromq.ip_bracket(ip_addrs[0])
|
||||
|
||||
|
||||
def _test_addrs(addrinfo, port):
|
||||
'''
|
||||
Attempt to connect to all addresses, return one if it succeeds.
|
||||
Otherwise, return all addrs.
|
||||
'''
|
||||
ip_addrs = []
|
||||
# test for connectivity, short circuit on success
|
||||
for a in addrinfo:
|
||||
ip_family = a[0]
|
||||
ip_addr = a[4][0]
|
||||
if ip_addr in ip_addrs:
|
||||
continue
|
||||
ip_addrs.append(ip_addr)
|
||||
|
||||
try:
|
||||
s = socket.socket(ip_family, socket.SOCK_STREAM)
|
||||
s.connect((ip_addr, port))
|
||||
s.close()
|
||||
|
||||
ip_addrs = [ip_addr]
|
||||
break
|
||||
except socket.error:
|
||||
pass
|
||||
return ip_addrs
|
||||
|
||||
|
||||
def parse_host_port(host_port):
|
||||
|
|
|
@ -11,6 +11,7 @@ from tests.support.unit import TestCase
|
|||
from tests.support.mock import (
|
||||
MagicMock,
|
||||
mock_open,
|
||||
create_autospec,
|
||||
patch,
|
||||
NO_MOCK,
|
||||
NO_MOCK_REASON,
|
||||
|
@ -18,6 +19,7 @@ from tests.support.mock import (
|
|||
|
||||
# Import salt libs
|
||||
import salt.utils.network as network
|
||||
import salt.exceptions
|
||||
from salt._compat import ipaddress
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
@ -248,25 +250,6 @@ class NetworkTestCase(TestCase):
|
|||
raise _e_
|
||||
|
||||
def test_dns_check(self):
|
||||
class MockSocket(object):
|
||||
def __init__(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def setsockopt(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def sendto(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def connect(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def close(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
hosts = [
|
||||
{'host': '10.10.0.3',
|
||||
'port': '',
|
||||
|
@ -279,22 +262,71 @@ class NetworkTestCase(TestCase):
|
|||
{'host': '2001:0db8:85a3::8a2e:0370:7334',
|
||||
'port': '',
|
||||
'mocked': [(10, 1, 6, '', ('2001:db8:85a3::8a2e:370:7334', 0, 0, 0))],
|
||||
'ret': '2001:db8:85a3::8a2e:370:7334'},
|
||||
'ret': '[2001:db8:85a3::8a2e:370:7334]'},
|
||||
{'host': '2001:0db8:85a3::8a2e:370:7334',
|
||||
'port': '1234',
|
||||
'mocked': [(10, 1, 6, '', ('2001:db8:85a3::8a2e:370:7334', 0, 0, 0))],
|
||||
'ret': '2001:db8:85a3::8a2e:370:7334'},
|
||||
'ret': '[2001:db8:85a3::8a2e:370:7334]'},
|
||||
{'host': 'salt-master',
|
||||
'port': '1234',
|
||||
'mocked': [(2, 1, 6, '', ('127.0.0.1', 0))],
|
||||
'ret': '127.0.0.1'},
|
||||
]
|
||||
for host in hosts:
|
||||
with patch.object(socket, 'getaddrinfo', MagicMock(return_value=host['mocked'])):
|
||||
with patch('socket.socket', MockSocket):
|
||||
with patch.object(socket, 'getaddrinfo', create_autospec(socket.getaddrinfo, return_value=host['mocked'])):
|
||||
with patch('socket.socket', create_autospec(socket.socket)):
|
||||
ret = network.dns_check(host['host'], host['port'])
|
||||
self.assertEqual(ret, host['ret'])
|
||||
|
||||
def test_dns_check_ipv6_filter(self):
|
||||
# raise exception to skip everything after the getaddrinfo call
|
||||
with patch.object(socket, 'getaddrinfo',
|
||||
create_autospec(socket.getaddrinfo, side_effect=Exception)) as getaddrinfo:
|
||||
for ipv6, param in [
|
||||
(None, socket.AF_UNSPEC),
|
||||
(True, socket.AF_INET6),
|
||||
(False, socket.AF_INET),
|
||||
]:
|
||||
with self.assertRaises(Exception):
|
||||
network.dns_check('foo', '1', ipv6=ipv6)
|
||||
getaddrinfo.assert_called_with('foo', '1', param, socket.SOCK_STREAM)
|
||||
|
||||
def test_dns_check_errors(self):
|
||||
with patch.object(socket, 'getaddrinfo', create_autospec(socket.getaddrinfo, return_value=[])):
|
||||
with self.assertRaisesRegex(salt.exceptions.SaltSystemExit,
|
||||
"DNS lookup or connection check of 'foo' failed"):
|
||||
network.dns_check('foo', '1')
|
||||
|
||||
with patch.object(socket, 'getaddrinfo', create_autospec(socket.getaddrinfo, side_effect=TypeError)):
|
||||
with self.assertRaisesRegex(salt.exceptions.SaltSystemExit,
|
||||
"Invalid or unresolveable address"):
|
||||
network.dns_check('foo', '1')
|
||||
|
||||
def test_test_addrs(self):
|
||||
# subset of real data from getaddrinfo against saltstack.com
|
||||
addrinfo = [(30, 2, 17, '', ('2600:9000:21eb:a800:8:1031:abc0:93a1', 0, 0, 0)),
|
||||
(30, 1, 6, '', ('2600:9000:21eb:a800:8:1031:abc0:93a1', 0, 0, 0)),
|
||||
(30, 2, 17, '', ('2600:9000:21eb:b400:8:1031:abc0:93a1', 0, 0, 0)),
|
||||
(30, 1, 6, '', ('2600:9000:21eb:b400:8:1031:abc0:93a1', 0, 0, 0)),
|
||||
(2, 1, 6, '', ('13.35.99.52', 0)), (2, 2, 17, '', ('13.35.99.85', 0)),
|
||||
(2, 1, 6, '', ('13.35.99.85', 0)), (2, 2, 17, '', ('13.35.99.122', 0))]
|
||||
with patch('socket.socket', create_autospec(socket.socket)) as s:
|
||||
# we connect to the first address
|
||||
addrs = network._test_addrs(addrinfo, 80)
|
||||
self.assertTrue(len(addrs) == 1)
|
||||
self.assertTrue(addrs[0] == addrinfo[0][4][0])
|
||||
|
||||
# the first lookup fails, succeeds on next check
|
||||
s.side_effect = [socket.error, MagicMock()]
|
||||
addrs = network._test_addrs(addrinfo, 80)
|
||||
self.assertTrue(len(addrs) == 1)
|
||||
self.assertTrue(addrs[0] == addrinfo[2][4][0])
|
||||
|
||||
# nothing can connect, but we've eliminated duplicates
|
||||
s.side_effect = socket.error
|
||||
addrs = network._test_addrs(addrinfo, 80)
|
||||
self.assertTrue(len(addrs) == 5)
|
||||
|
||||
def test_is_subnet(self):
|
||||
for subnet_data in (IPV4_SUBNETS, IPV6_SUBNETS):
|
||||
for item in subnet_data[True]:
|
||||
|
|
Loading…
Add table
Reference in a new issue