mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-28 05:11:25 -07:00
Fix interfaces_file for proper file contents (#37818)
The generated file was completely unusable by the system therefore the fix which ensures that diffing the file prior to changes and after only shows diffs Furthermore the code did not work for Python 3.6 > f.writelines(to_bytes(lines, errors='surrogate_or_strict')) E TypeError: a bytes-like object is required, not 'int' The other modifications (lambda variable renaming) is to comply with default flake8 rules
This commit is contained in:
parent
710db82930
commit
612d0d6634
8 changed files with 248 additions and 6 deletions
|
@ -16,14 +16,13 @@
|
|||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from ansible.compat.tests import unittest
|
||||
import ansible.module_utils.basic
|
||||
from ansible.modules.system import interfaces_file
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
import io
|
||||
import inspect
|
||||
import json
|
||||
from shutil import copyfile, move
|
||||
import difflib
|
||||
|
||||
|
||||
class AnsibleFailJson(Exception):
|
||||
|
@ -31,6 +30,14 @@ class AnsibleFailJson(Exception):
|
|||
|
||||
|
||||
class ModuleMocked():
|
||||
def atomic_move(self, src, dst):
|
||||
move(src, dst)
|
||||
|
||||
def backup_local(self, path):
|
||||
backupp = os.path.join("/tmp", os.path.basename(path) + ".bak")
|
||||
copyfile(path, backupp)
|
||||
return backupp
|
||||
|
||||
def fail_json(self, msg):
|
||||
raise AnsibleFailJson(msg)
|
||||
|
||||
|
@ -44,6 +51,18 @@ class TestInterfacesFileModule(unittest.TestCase):
|
|||
def getTestFiles(self):
|
||||
return next(os.walk(fixture_path))[2]
|
||||
|
||||
def compareFileToBackup(self, path, backup):
|
||||
with open(path) as f1:
|
||||
with open(backup) as f2:
|
||||
diffs = difflib.context_diff(f1.readlines(),
|
||||
f2.readlines(),
|
||||
fromfile=os.path.basename(path),
|
||||
tofile=os.path.basename(backup))
|
||||
# Restore backup
|
||||
move(backup, path)
|
||||
deltas = [d for d in diffs]
|
||||
self.assertTrue(len(deltas) == 0)
|
||||
|
||||
def compareInterfacesLinesToFile(self, interfaces_lines, path, testname=None):
|
||||
if not testname:
|
||||
testname = "%s.%s" % (path, inspect.stack()[1][3])
|
||||
|
@ -137,3 +156,35 @@ class TestInterfacesFileModule(unittest.TestCase):
|
|||
|
||||
self.compareInterfacesLinesToFile(lines, testfile, "%s_%s" % (testfile, testname))
|
||||
self.compareInterfacesToFile(ifaces, testfile, "%s_%s.json" % (testfile, testname))
|
||||
|
||||
def test_revert(self):
|
||||
testcases = {
|
||||
"revert": [
|
||||
{
|
||||
'iface': 'eth0',
|
||||
'option': 'mtu',
|
||||
'value': '1350',
|
||||
}
|
||||
],
|
||||
}
|
||||
for testname, options_list in testcases.items():
|
||||
for testfile in self.getTestFiles():
|
||||
path = os.path.join(fixture_path, testfile)
|
||||
lines, ifaces = interfaces_file.read_interfaces_file(module, path)
|
||||
backupp = module.backup_local(path)
|
||||
options = options_list[0]
|
||||
for state in ['present', 'absent']:
|
||||
fail_json_iterations = []
|
||||
options['state'] = state
|
||||
try:
|
||||
_, lines = interfaces_file.setInterfaceOption(module, lines, options['iface'], options['option'], options['value'], options['state'])
|
||||
except AnsibleFailJson as e:
|
||||
fail_json_iterations.append("fail_json message: %s\noptions:\n%s" %
|
||||
(str(e), json.dumps(options, sort_keys=True, indent=4, separators=(',', ': '))))
|
||||
interfaces_file.write_changes(module, [d['line'] for d in lines if 'line' in d], path)
|
||||
|
||||
self.compareStringWithFile("\n=====\n".join(fail_json_iterations), "%s_%s.exceptions.txt" % (testfile, testname))
|
||||
|
||||
self.compareInterfacesLinesToFile(lines, testfile, "%s_%s" % (testfile, testname))
|
||||
self.compareInterfacesToFile(ifaces, testfile, "%s_%s.json" % (testfile, testname))
|
||||
self.compareFileToBackup(path, backupp)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue