mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge pull request #48081 from terminalmage/issue48012
Fix UnicodeDecodeError when parsing hosts file with non-ascii
This commit is contained in:
commit
c05c176782
12 changed files with 184 additions and 168 deletions
|
@ -20,7 +20,7 @@ import salt.utils.stringutils
|
|||
import salt.utils.files
|
||||
|
||||
# Import 3rd-party libs
|
||||
import salt.ext.six
|
||||
from salt.ext import six
|
||||
# pylint: disable=import-error
|
||||
from salt.ext.six.moves import map
|
||||
# pylint: enable=import-error
|
||||
|
@ -190,7 +190,7 @@ def beacon(config):
|
|||
event = {}
|
||||
for ind, field in enumerate(FIELDS):
|
||||
event[field] = pack[ind]
|
||||
if isinstance(event[field], salt.ext.six.string_types):
|
||||
if isinstance(event[field], six.string_types):
|
||||
if isinstance(event[field], bytes):
|
||||
event[field] = salt.utils.stringutils.to_unicode(event[field])
|
||||
event[field] = event[field].strip('\x00')
|
||||
|
|
|
@ -179,13 +179,10 @@ def persist(name, value, config='/etc/sysctl.conf', apply_change=False):
|
|||
rest = rest[len(rest_v):]
|
||||
if rest_v == value:
|
||||
return 'Already set'
|
||||
new_line = '{0}={1}'.format(name, value)
|
||||
nlines.append(new_line)
|
||||
nlines.append('\n')
|
||||
nlines.append('{0}={1}\n'.format(name, value))
|
||||
edited = True
|
||||
if not edited:
|
||||
nlines.append('{0}={1}'.format(name, value))
|
||||
nlines.append('\n')
|
||||
nlines.append('{0}={1}\n'.format(name, value))
|
||||
nlines = [salt.utils.stringutils.to_str(_l) for _l in nlines]
|
||||
with salt.utils.files.fopen(config, 'w+') as ofile:
|
||||
ofile.writelines(nlines)
|
||||
|
|
|
@ -148,14 +148,18 @@ def _generate_minion_id():
|
|||
addr=hosts.first() or 'localhost (N/A)', message=socket.gaierror)
|
||||
)
|
||||
# Universal method for everywhere (Linux, Slowlaris, Windows etc)
|
||||
for f_name in ['/etc/hostname', '/etc/nodename', '/etc/hosts',
|
||||
r'{win}\system32\drivers\etc\hosts'.format(win=os.getenv('WINDIR'))]:
|
||||
if not os.path.exists(f_name):
|
||||
continue
|
||||
with salt.utils.files.fopen(f_name) as f_hdl:
|
||||
for hst in (line.strip().split('#')[0].strip().split() or None for line in f_hdl.read().split(os.linesep)):
|
||||
if hst and (hst[0][:4] in ['127.', '::1'] or len(hst) == 1):
|
||||
hosts.extend(hst)
|
||||
for f_name in ('/etc/hostname', '/etc/nodename', '/etc/hosts',
|
||||
r'{win}\system32\drivers\etc\hosts'.format(win=os.getenv('WINDIR'))):
|
||||
try:
|
||||
with salt.utils.files.fopen(f_name) as f_hdl:
|
||||
for line in f_hdl:
|
||||
line = salt.utils.stringutils.to_unicode(line)
|
||||
hst = line.strip().split('#')[0].strip().split()
|
||||
if hst:
|
||||
if hst[0][:4] in ('127.', '::1') or len(hst) == 1:
|
||||
hosts.extend(hst)
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
# include public and private ipaddresses
|
||||
return hosts.extend([addr for addr in ip_addrs()
|
||||
|
|
|
@ -15,10 +15,13 @@
|
|||
# pylint: disable=unused-import,function-redefined,blacklisted-module,blacklisted-external-module
|
||||
|
||||
from __future__ import absolute_import
|
||||
import errno
|
||||
import fnmatch
|
||||
import sys
|
||||
|
||||
# Import salt libs
|
||||
from salt.ext import six
|
||||
import salt.utils.stringutils
|
||||
|
||||
try:
|
||||
from mock import (
|
||||
|
@ -98,30 +101,33 @@ file_spec = None
|
|||
|
||||
|
||||
def _iterate_read_data(read_data):
|
||||
# Helper for mock_open:
|
||||
# Retrieve lines from read_data via a generator so that separate calls to
|
||||
# readline, read, and readlines are properly interleaved
|
||||
if six.PY3 and isinstance(read_data, six.binary_type):
|
||||
data_as_list = ['{0}\n'.format(l.decode(__salt_system_encoding__)) for l in read_data.split(b'\n')]
|
||||
else:
|
||||
data_as_list = ['{0}\n'.format(l) for l in read_data.split('\n')]
|
||||
'''
|
||||
Helper for mock_open:
|
||||
Retrieve lines from read_data via a generator so that separate calls to
|
||||
readline, read, and readlines are properly interleaved
|
||||
'''
|
||||
# Newline will always be a bytestring on PY2 because mock_open will have
|
||||
# normalized it to one.
|
||||
newline = b'\n' if isinstance(read_data, six.binary_type) else '\n'
|
||||
|
||||
if data_as_list[-1] == '\n':
|
||||
read_data = [line + newline for line in read_data.split(newline)]
|
||||
|
||||
if read_data[-1] == newline:
|
||||
# If the last line ended in a newline, the list comprehension will have an
|
||||
# extra entry that's just a newline. Remove this.
|
||||
data_as_list = data_as_list[:-1]
|
||||
# extra entry that's just a newline. Remove this.
|
||||
read_data = read_data[:-1]
|
||||
else:
|
||||
# If there wasn't an extra newline by itself, then the file being
|
||||
# emulated doesn't have a newline to end the last line remove the
|
||||
# newline that our naive format() added
|
||||
data_as_list[-1] = data_as_list[-1][:-1]
|
||||
# emulated doesn't have a newline to end the last line, so remove the
|
||||
# newline that we added in the list comprehension.
|
||||
read_data[-1] = read_data[-1][:-1]
|
||||
|
||||
for line in data_as_list:
|
||||
for line in read_data:
|
||||
yield line
|
||||
|
||||
|
||||
def mock_open(mock=None, read_data=''):
|
||||
"""
|
||||
def mock_open(mock=None, read_data='', match=None):
|
||||
'''
|
||||
A helper function to create a mock to replace the use of `open`. It works
|
||||
for `open` called directly or used as a context manager.
|
||||
|
||||
|
@ -131,7 +137,18 @@ def mock_open(mock=None, read_data=''):
|
|||
|
||||
`read_data` is a string for the `read` methoddline`, and `readlines` of the
|
||||
file handle to return. This is an empty string by default.
|
||||
"""
|
||||
|
||||
If passed, `match` can be either a string or an iterable containing
|
||||
patterns to attempt to match using fnmatch.fnmatch(). A side_effect will be
|
||||
added to the mock object returned, which will cause an IOError(2, 'No such
|
||||
file or directory') to be raised when the file path is not a match. This
|
||||
allows you to make your mocked filehandle only work for certain file paths.
|
||||
'''
|
||||
# Normalize read_data, Python 2 filehandles should never produce unicode
|
||||
# types on read.
|
||||
if six.PY2:
|
||||
read_data = salt.utils.stringutils.to_str(read_data)
|
||||
|
||||
def _readlines_side_effect(*args, **kwargs):
|
||||
if handle.readlines.return_value is not None:
|
||||
return handle.readlines.return_value
|
||||
|
@ -140,7 +157,8 @@ def mock_open(mock=None, read_data=''):
|
|||
def _read_side_effect(*args, **kwargs):
|
||||
if handle.read.return_value is not None:
|
||||
return handle.read.return_value
|
||||
return ''.join(_data)
|
||||
joiner = b'' if isinstance(read_data, six.binary_type) else ''
|
||||
return joiner.join(_data)
|
||||
|
||||
def _readline_side_effect():
|
||||
if handle.readline.return_value is not None:
|
||||
|
@ -170,10 +188,25 @@ def mock_open(mock=None, read_data=''):
|
|||
handle.readline.return_value = None
|
||||
handle.readlines.return_value = None
|
||||
|
||||
# Support iteration via for loop
|
||||
handle.__iter__ = lambda x: _readline_side_effect()
|
||||
|
||||
# This is salt specific and not in the upstream mock
|
||||
handle.read.side_effect = _read_side_effect
|
||||
handle.readline.side_effect = _readline_side_effect()
|
||||
handle.readlines.side_effect = _readlines_side_effect
|
||||
|
||||
if match is not None:
|
||||
if isinstance(match, six.string_types):
|
||||
match = [match]
|
||||
|
||||
def fopen_side_effect(name, *args, **kwargs):
|
||||
for pat in match:
|
||||
if fnmatch.fnmatch(name, pat):
|
||||
return DEFAULT
|
||||
raise IOError(errno.ENOENT, 'No such file or directory', name)
|
||||
|
||||
mock.side_effect = fopen_side_effect
|
||||
|
||||
mock.return_value = handle
|
||||
return mock
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
# Python libs
|
||||
from __future__ import absolute_import
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Salt testing libs
|
||||
from tests.support.unit import skipIf, TestCase
|
||||
|
@ -13,12 +12,9 @@ from tests.support.mixins import LoaderModuleMockMixin
|
|||
# Salt libs
|
||||
import salt.beacons.btmp as btmp
|
||||
|
||||
if sys.version_info >= (3,):
|
||||
raw = bytes('\x06\x00\x00\x00Nt\x00\x00ssh:notty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00garet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xc7\xc2Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'utf-8')
|
||||
pack = (6, 29774, b'ssh:notty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00', b'garet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 0, 0, 0, 1505937373, 0, 0, 0, 0, 16777216)
|
||||
else:
|
||||
raw = b'\x06\x00\x00\x00Nt\x00\x00ssh:notty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00garet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xc7\xc2Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
pack = (6, 29774, 'ssh:notty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '\x00\x00\x00\x00', 'garet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 0, 0, 0, 1505937373, 0, 0, 0, 0, 16777216)
|
||||
raw = b'\x06\x00\x00\x00Nt\x00\x00ssh:notty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00garet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xc7\xc2Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
pack = (6, 29774, b'ssh:notty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'\x00\x00\x00\x00', b'garet\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 0, 0, 0, 1505937373, 0, 0, 0, 0, 16777216)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
# Python libs
|
||||
from __future__ import absolute_import
|
||||
import logging
|
||||
import sys
|
||||
|
||||
# Salt testing libs
|
||||
from tests.support.unit import skipIf, TestCase
|
||||
|
@ -13,12 +12,8 @@ from tests.support.mixins import LoaderModuleMockMixin
|
|||
# Salt libs
|
||||
import salt.beacons.wtmp as wtmp
|
||||
|
||||
if sys.version_info >= (3,):
|
||||
raw = bytes('\x07\x00\x00\x00H\x18\x00\x00pts/14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s/14gareth\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13I\xc5YZf\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'utf-8')
|
||||
pack = (7, 6216, b'pts/14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b's/14', b'gareth\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 0, 0, 0, 1506101523, 353882, 0, 0, 0, 16777216)
|
||||
else:
|
||||
raw = b'\x07\x00\x00\x00H\x18\x00\x00pts/14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s/14gareth\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13I\xc5YZf\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
pack = (7, 6216, 'pts/14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 's/14', 'gareth\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', '::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 0, 0, 0, 1506101523, 353882, 0, 0, 0, 16777216)
|
||||
raw = b'\x07\x00\x00\x00H\x18\x00\x00pts/14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s/14gareth\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13I\xc5YZf\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
pack = (7, 6216, b'pts/14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b's/14', b'gareth\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'::1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 0, 0, 0, 1506101523, 353882, 0, 0, 0, 16777216)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
import logging
|
||||
import os
|
||||
import textwrap
|
||||
|
||||
# Import Salt Testing Libs
|
||||
try:
|
||||
|
@ -66,9 +67,8 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
|
|||
def test_parse_etc_os_release(self, path_isfile_mock):
|
||||
path_isfile_mock.side_effect = lambda x: x == "/usr/lib/os-release"
|
||||
with salt.utils.files.fopen(os.path.join(OS_RELEASE_DIR, "ubuntu-17.10")) as os_release_file:
|
||||
os_release_content = os_release_file.readlines()
|
||||
with patch("salt.utils.files.fopen", mock_open()) as os_release_file:
|
||||
os_release_file.return_value.__iter__.return_value = os_release_content
|
||||
os_release_content = os_release_file.read()
|
||||
with patch("salt.utils.files.fopen", mock_open(read_data=os_release_content)):
|
||||
os_release = core._parse_os_release(["/etc/os-release", "/usr/lib/os-release"])
|
||||
self.assertEqual(os_release, {
|
||||
"NAME": "Ubuntu",
|
||||
|
@ -269,34 +269,26 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
|
|||
return orig_import(name, *args)
|
||||
|
||||
# Skip the first if statement
|
||||
with patch.object(salt.utils.platform, 'is_proxy',
|
||||
MagicMock(return_value=False)):
|
||||
# Skip the selinux/systemd stuff (not pertinent)
|
||||
with patch.object(core, '_linux_bin_exists',
|
||||
MagicMock(return_value=False)):
|
||||
# Skip the init grain compilation (not pertinent)
|
||||
with patch.object(os.path, 'exists', path_isfile_mock):
|
||||
# Ensure that lsb_release fails to import
|
||||
with patch('{0}.__import__'.format(built_in),
|
||||
side_effect=_import_mock):
|
||||
# Skip all the /etc/*-release stuff (not pertinent)
|
||||
with patch.object(os.path, 'isfile', path_isfile_mock):
|
||||
with patch.object(core, '_parse_os_release', os_release_mock):
|
||||
# Mock linux_distribution to give us the OS
|
||||
# name that we want.
|
||||
distro_mock = MagicMock(
|
||||
return_value=os_release_map['linux_distribution']
|
||||
)
|
||||
with patch('salt.utils.files.fopen', mock_open()) as suse_release_file:
|
||||
suse_release_file.return_value.__iter__.return_value = \
|
||||
os_release_map.get('suse_release_file', '').splitlines()
|
||||
with patch.object(core, 'linux_distribution', distro_mock):
|
||||
with patch.object(core, '_linux_gpu_data', empty_mock):
|
||||
with patch.object(core, '_linux_cpudata', empty_mock):
|
||||
with patch.object(core, '_virtual', empty_mock):
|
||||
# Mock the osarch
|
||||
with patch.dict(core.__salt__, {'cmd.run': osarch_mock}):
|
||||
os_grains = core.os_data()
|
||||
# Skip the selinux/systemd stuff (not pertinent)
|
||||
# Skip the init grain compilation (not pertinent)
|
||||
# Ensure that lsb_release fails to import
|
||||
# Skip all the /etc/*-release stuff (not pertinent)
|
||||
# - Mock linux_distribution to give us the OS name that we want.
|
||||
# Mock the osarch
|
||||
distro_mock = MagicMock(return_value=os_release_map['linux_distribution'])
|
||||
with patch.object(salt.utils.platform, 'is_proxy', MagicMock(return_value=False)), \
|
||||
patch.object(core, '_linux_bin_exists', MagicMock(return_value=False)), \
|
||||
patch.object(os.path, 'exists', path_isfile_mock), \
|
||||
patch('{0}.__import__'.format(built_in), side_effect=_import_mock), \
|
||||
patch.object(os.path, 'isfile', path_isfile_mock), \
|
||||
patch.object(core, '_parse_os_release', os_release_mock), \
|
||||
patch('salt.utils.files.fopen', mock_open(read_data=os_release_map.get('suse_release_file', ''))), \
|
||||
patch.object(core, 'linux_distribution', distro_mock), \
|
||||
patch.object(core, '_linux_gpu_data', empty_mock), \
|
||||
patch.object(core, '_linux_cpudata', empty_mock), \
|
||||
patch.object(core, '_virtual', empty_mock), \
|
||||
patch.dict(core.__salt__, {'cmd.run': osarch_mock}):
|
||||
os_grains = core.os_data()
|
||||
|
||||
grains = {k: v for k, v in os_grains.items()
|
||||
if k in set(["os", "os_family", "osfullname", "oscodename", "osfinger",
|
||||
|
@ -315,10 +307,11 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
|
|||
Test if OS grains are parsed correctly in SLES 11 SP3
|
||||
'''
|
||||
_os_release_map = {
|
||||
'suse_release_file': '''SUSE Linux Enterprise Server 11 (x86_64)
|
||||
VERSION = 11
|
||||
PATCHLEVEL = 3
|
||||
''',
|
||||
'suse_release_file': textwrap.dedent('''
|
||||
SUSE Linux Enterprise Server 11 (x86_64)
|
||||
VERSION = 11
|
||||
PATCHLEVEL = 3
|
||||
'''),
|
||||
'files': ["/etc/SuSE-release"],
|
||||
}
|
||||
expectation = {
|
||||
|
@ -587,8 +580,9 @@ PATCHLEVEL = 3
|
|||
)
|
||||
empty_mock = MagicMock(return_value={})
|
||||
|
||||
_proc_meminfo_file = '''MemTotal: 16277028 kB
|
||||
SwapTotal: 4789244 kB'''
|
||||
_proc_meminfo = textwrap.dedent('''\
|
||||
MemTotal: 16277028 kB
|
||||
SwapTotal: 4789244 kB''')
|
||||
|
||||
orig_import = __import__
|
||||
if six.PY2:
|
||||
|
@ -601,49 +595,28 @@ SwapTotal: 4789244 kB'''
|
|||
raise ImportError('No module named lsb_release')
|
||||
return orig_import(name, *args)
|
||||
|
||||
# Skip the first if statement
|
||||
with patch.object(salt.utils.platform, 'is_proxy',
|
||||
MagicMock(return_value=False)):
|
||||
# Skip the selinux/systemd stuff (not pertinent)
|
||||
with patch.object(core, '_linux_bin_exists',
|
||||
MagicMock(return_value=False)):
|
||||
# Skip the init grain compilation (not pertinent)
|
||||
with patch.object(os.path, 'exists', path_exists_mock):
|
||||
# Ensure that lsb_release fails to import
|
||||
with patch('{0}.__import__'.format(built_in),
|
||||
side_effect=_import_mock):
|
||||
# Skip all the /etc/*-release stuff (not pertinent)
|
||||
with patch.object(os.path, 'isfile', path_isfile_mock):
|
||||
# Make a bunch of functions return empty dicts,
|
||||
# we don't care about these grains for the
|
||||
# purposes of this test.
|
||||
with patch.object(
|
||||
core,
|
||||
'_linux_cpudata',
|
||||
empty_mock):
|
||||
with patch.object(
|
||||
core,
|
||||
'_linux_gpu_data',
|
||||
empty_mock):
|
||||
with patch('salt.utils.files.fopen', mock_open()) as _proc_meminfo:
|
||||
_proc_meminfo.return_value.__iter__.return_value = _proc_meminfo_file.splitlines()
|
||||
with patch.object(
|
||||
core,
|
||||
'_hw_data',
|
||||
empty_mock):
|
||||
with patch.object(
|
||||
core,
|
||||
'_virtual',
|
||||
empty_mock):
|
||||
with patch.object(
|
||||
core,
|
||||
'_ps',
|
||||
empty_mock):
|
||||
# Mock the osarch
|
||||
with patch.dict(
|
||||
core.__salt__,
|
||||
{'cmd.run': cmd_run_mock}):
|
||||
os_grains = core.os_data()
|
||||
# Mock a bunch of stuff so we can isolate the mem stuff:
|
||||
# - Skip the first if statement
|
||||
# - Skip the init grain compilation (not pertinent)
|
||||
# - Ensure that lsb_release fails to import
|
||||
# - Skip all the /etc/*-release stuff (not pertinent)
|
||||
# - Make a bunch of functions return empty dicts, we don't care
|
||||
# about these grains for the purposes of this test.
|
||||
# - Mock the osarch
|
||||
# - And most importantly, mock the contents of /proc/meminfo
|
||||
with patch.object(salt.utils.platform, 'is_proxy', MagicMock(return_value=False)), \
|
||||
patch.object(core, '_linux_bin_exists', MagicMock(return_value=False)), \
|
||||
patch.object(os.path, 'exists', path_exists_mock), \
|
||||
patch('{0}.__import__'.format(built_in), side_effect=_import_mock), \
|
||||
patch.object(os.path, 'isfile', path_isfile_mock), \
|
||||
patch.object(core, '_linux_cpudata', empty_mock), \
|
||||
patch.object(core, '_linux_gpu_data', empty_mock), \
|
||||
patch.object(core, '_hw_data', empty_mock), \
|
||||
patch.object(core, '_virtual', empty_mock), \
|
||||
patch.object(core, '_ps', empty_mock), \
|
||||
patch.dict(core.__salt__, {'cmd.run': cmd_run_mock}), \
|
||||
patch('salt.utils.files.fopen', mock_open(read_data=_proc_meminfo)):
|
||||
os_grains = core.os_data()
|
||||
|
||||
self.assertEqual(os_grains.get('mem_total'), 15895)
|
||||
self.assertEqual(os_grains.get('swap_total'), 4676)
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
# Import Python libs
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
import os
|
||||
import textwrap
|
||||
|
||||
# Import Salt Testing Libs
|
||||
from tests.support.unit import TestCase, skipIf
|
||||
|
@ -51,15 +52,16 @@ class IscsiGrainsTestCase(TestCase):
|
|||
['iqn.localhost.hostid.7f000001'])
|
||||
|
||||
def test_linux_iscsi_iqn_grains(self):
|
||||
_iscsi_file = '## DO NOT EDIT OR REMOVE THIS FILE!\n' \
|
||||
'## If you remove this file, the iSCSI daemon will not start.\n' \
|
||||
'## If you change the InitiatorName, existing access control lists\n' \
|
||||
'## may reject this initiator. The InitiatorName must be unique\n' \
|
||||
'## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames.\n' \
|
||||
'InitiatorName=iqn.1993-08.org.debian:01:d12f7aba36\n'
|
||||
_iscsi_file = textwrap.dedent('''\
|
||||
## DO NOT EDIT OR REMOVE THIS FILE!
|
||||
## If you remove this file, the iSCSI daemon will not start.
|
||||
## If you change the InitiatorName, existing access control lists
|
||||
## may reject this initiator. The InitiatorName must be unique
|
||||
## for each iSCSI initiator. Do NOT duplicate iSCSI InitiatorNames.
|
||||
InitiatorName=iqn.1993-08.org.debian:01:d12f7aba36
|
||||
''')
|
||||
|
||||
with patch('salt.utils.files.fopen', mock_open()) as iscsi_initiator_file:
|
||||
iscsi_initiator_file.return_value.__iter__.return_value = _iscsi_file.splitlines()
|
||||
with patch('salt.utils.files.fopen', mock_open(read_data=_iscsi_file)):
|
||||
iqn = iscsi._linux_iqn()
|
||||
|
||||
assert isinstance(iqn, list)
|
||||
|
|
|
@ -147,7 +147,7 @@ class CpTestCase(TestCase, LoaderModuleMockMixin):
|
|||
cmd='_file_recv',
|
||||
tok='token',
|
||||
path=['saltines', 'test.file'],
|
||||
data='', # data is empty here because load['data'] is overwritten
|
||||
data=b'', # data is empty here because load['data'] is overwritten
|
||||
id='abc'
|
||||
)
|
||||
)
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
# Import Python libs
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
import os
|
||||
import textwrap
|
||||
|
||||
# Import Salt Testing Libs
|
||||
from tests.support.mixins import LoaderModuleMockMixin
|
||||
|
@ -20,7 +21,6 @@ from tests.support.mock import (
|
|||
# Import Salt Libs
|
||||
from salt.exceptions import CommandExecutionError
|
||||
import salt.modules.dnsmasq as dnsmasq
|
||||
import salt.utils.stringutils
|
||||
|
||||
|
||||
@skipIf(NO_MOCK, NO_MOCK_REASON)
|
||||
|
@ -98,13 +98,14 @@ class DnsmasqTestCase(TestCase, LoaderModuleMockMixin):
|
|||
test for generic function for parsing dnsmasq files including includes.
|
||||
'''
|
||||
with patch('os.path.isfile', MagicMock(return_value=True)):
|
||||
text_file_data = salt.utils.stringutils.to_str(
|
||||
'\n'.join(["line here", "second line", "A=B", "#"]))
|
||||
text_file_data = textwrap.dedent('''\
|
||||
line here
|
||||
second line
|
||||
A=B
|
||||
#''')
|
||||
with patch('salt.utils.files.fopen',
|
||||
mock_open(read_data=text_file_data),
|
||||
create=True) as m:
|
||||
m.return_value.__iter__.return_value = text_file_data.splitlines()
|
||||
mock_open(read_data=text_file_data)):
|
||||
self.assertDictEqual(dnsmasq._parse_dnamasq('filename'),
|
||||
{'A': 'B',
|
||||
'unparsed': ['line here',
|
||||
'second line']})
|
||||
'unparsed': ['line here\n',
|
||||
'second line\n']})
|
||||
|
|
|
@ -91,7 +91,12 @@ class DarwinSysctlTestCase(TestCase, LoaderModuleMockMixin):
|
|||
Tests successful write to existing sysctl file
|
||||
'''
|
||||
to_write = '#\n# Kernel sysctl configuration\n#\n'
|
||||
m_calls_list = [call.writelines(['net.inet.icmp.icmplim=50', '\n'])]
|
||||
m_calls_list = [call.writelines([
|
||||
'#\n',
|
||||
'# Kernel sysctl configuration\n',
|
||||
'#\n',
|
||||
'net.inet.icmp.icmplim=50\n',
|
||||
])]
|
||||
with patch('salt.utils.files.fopen', mock_open(read_data=to_write)) as m_open, \
|
||||
patch('os.path.isfile', MagicMock(return_value=True)):
|
||||
mac_sysctl.persist('net.inet.icmp.icmplim', 50, config=to_write)
|
||||
|
|
|
@ -3,11 +3,18 @@
|
|||
from __future__ import absolute_import, unicode_literals, print_function
|
||||
import logging
|
||||
import socket
|
||||
import textwrap
|
||||
|
||||
# Import Salt Testing libs
|
||||
from tests.support.unit import skipIf
|
||||
from tests.support.unit import TestCase
|
||||
from tests.support.mock import NO_MOCK, NO_MOCK_REASON, patch, MagicMock
|
||||
from tests.support.mock import (
|
||||
MagicMock,
|
||||
mock_open,
|
||||
patch,
|
||||
NO_MOCK,
|
||||
NO_MOCK_REASON,
|
||||
)
|
||||
|
||||
# Import salt libs
|
||||
import salt.utils.network as network
|
||||
|
@ -147,6 +154,20 @@ class NetworkTestCase(TestCase):
|
|||
def test_generate_minion_id(self):
|
||||
self.assertTrue(network.generate_minion_id())
|
||||
|
||||
def test__generate_minion_id_with_unicode_in_etc_hosts(self):
|
||||
'''
|
||||
Test that unicode in /etc/hosts doesn't raise an error when
|
||||
_generate_minion_id() helper is called to gather the hosts.
|
||||
'''
|
||||
content = textwrap.dedent('''\
|
||||
# 以下为主机名解析
|
||||
## ccc
|
||||
127.0.0.1 localhost thisismyhostname # 本机
|
||||
''')
|
||||
fopen_mock = mock_open(read_data=content, match='/etc/hosts')
|
||||
with patch('salt.utils.files.fopen', fopen_mock):
|
||||
assert 'thisismyhostname' in network._generate_minion_id()
|
||||
|
||||
def test_is_ip(self):
|
||||
self.assertTrue(network.is_ip('10.10.0.3'))
|
||||
self.assertFalse(network.is_ip('0.9.800.1000'))
|
||||
|
@ -320,8 +341,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='hostname')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='hostname.domainname.blank')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'attrname', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4', '5.6.7.8'])):
|
||||
self.assertEqual(network._generate_minion_id(),
|
||||
['hostname.domainname.blank', 'nodename', 'hostname', '1.2.3.4', '5.6.7.8'])
|
||||
|
@ -336,8 +356,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='127')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='127.domainname.blank')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'attrname', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4', '5.6.7.8'])):
|
||||
self.assertEqual(network._generate_minion_id(),
|
||||
['127.domainname.blank', '127', '1.2.3.4', '5.6.7.8'])
|
||||
|
@ -352,8 +371,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='127890')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='127890.domainname.blank')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'attrname', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4', '5.6.7.8'])):
|
||||
self.assertEqual(network._generate_minion_id(),
|
||||
['127890.domainname.blank', '127890', '1.2.3.4', '5.6.7.8'])
|
||||
|
@ -368,8 +386,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='hostname')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='hostname')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'hostname', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4', '1.2.3.4', '1.2.3.4'])):
|
||||
self.assertEqual(network._generate_minion_id(), ['hostname', '1.2.3.4'])
|
||||
|
||||
|
@ -384,8 +401,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='hostname')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'hostname', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4', '1.2.3.4', '1.2.3.4'])):
|
||||
self.assertEqual(network.generate_minion_id(), 'very.long.and.complex.domain.name')
|
||||
|
||||
|
@ -399,8 +415,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='pick.me')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='hostname.domainname.blank')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'hostname', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4', '1.2.3.4', '1.2.3.4'])):
|
||||
self.assertEqual(network.generate_minion_id(), 'hostname.domainname.blank')
|
||||
|
||||
|
@ -414,8 +429,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='ip6-loopback')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='ip6-localhost')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'localhost', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['127.0.0.1', '::1', 'fe00::0', 'fe02::1', '1.2.3.4'])):
|
||||
self.assertEqual(network.generate_minion_id(), '1.2.3.4')
|
||||
|
||||
|
@ -429,8 +443,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='ip6-loopback')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='ip6-localhost')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'localhost', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['127.0.0.1', '::1', 'fe00::0', 'fe02::1'])):
|
||||
self.assertEqual(network.generate_minion_id(), 'localhost')
|
||||
|
||||
|
@ -444,8 +457,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='ip6-loopback')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='pick.me')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'localhost', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['127.0.0.1', '::1', 'fe00::0', 'fe02::1'])):
|
||||
self.assertEqual(network.generate_minion_id(), 'pick.me')
|
||||
|
||||
|
@ -459,8 +471,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='ip6-loopback')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='ip6-localhost')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'pick.me', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['127.0.0.1', '::1', 'fe00::0', 'fe02::1'])):
|
||||
self.assertEqual(network.generate_minion_id(), 'pick.me')
|
||||
|
||||
|
@ -474,8 +485,7 @@ class NetworkTestCase(TestCase):
|
|||
patch('socket.gethostname', MagicMock(return_value='ip6-loopback')), \
|
||||
patch('socket.getfqdn', MagicMock(return_value='ip6-localhost')), \
|
||||
patch('socket.getaddrinfo', MagicMock(return_value=[(2, 3, 0, 'localhost', ('127.0.1.1', 0))])), \
|
||||
patch('salt.utils.files.fopen', MagicMock(return_value=False)), \
|
||||
patch('os.path.exists', MagicMock(return_value=False)), \
|
||||
patch('salt.utils.files.fopen', mock_open()), \
|
||||
patch('salt.utils.network.ip_addrs', MagicMock(return_value=['127.0.0.1', '::1', 'fe00::0', 'fe02::1', '1.2.3.4'])):
|
||||
self.assertEqual(network.generate_minion_id(), '1.2.3.4')
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue