Merge branch '2019.2.1' into 2019.2.1

This commit is contained in:
David Hilton 2019-09-29 07:32:37 -04:00 committed by GitHub
commit fa1a767b32
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 132 additions and 99 deletions

View 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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
'''
Metaproxy Directory
'''

View file

@ -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):

View file

@ -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]: