Merge branch '2019.2.1' into mf_53662

This commit is contained in:
Shane Lee 2019-07-06 09:16:36 -06:00 committed by GitHub
commit b9033b9a2c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 109 additions and 31 deletions

View file

@ -298,7 +298,9 @@ def render_jinja_tmpl(tmplstr, context, tmplpath=None):
tmplstr = tmplstr.decode(SLS_ENCODING)
if tmplstr.endswith(os.linesep):
newline = True
newline = os.linesep
elif tmplstr.endswith('\n'):
newline = '\n'
if not saltenv:
if tmplpath:
@ -443,7 +445,7 @@ def render_jinja_tmpl(tmplstr, context, tmplpath=None):
# Workaround a bug in Jinja that removes the final newline
# (https://github.com/mitsuhiko/jinja2/issues/75)
if newline:
output += os.linesep
output += newline
return output

View file

@ -166,13 +166,45 @@ secrets:
GPG_PILLAR_ENCRYPTED = {
'secrets': {
'vault': {
'foo': '-----BEGIN PGP MESSAGE-----\n\nhQEMAw2B674HRhwSAQgAhTrN8NizwUv/VunVrqa4/X8t6EUulrnhKcSeb8sZS4th\nW1Qz3K2NjL4lkUHCQHKZVx/VoZY7zsddBIFvvoGGfj8+2wjkEDwFmFjGE4DEsS74\nZLRFIFJC1iB/O0AiQ+oU745skQkU6OEKxqavmKMrKo3rvJ8ZCXDC470+i2/Hqrp7\n+KWGmaDOO422JaSKRm5D9bQZr9oX7KqnrPG9I1+UbJyQSJdsdtquPWmeIpamEVHb\nVMDNQRjSezZ1yKC4kCWm3YQbBF76qTHzG1VlLF5qOzuGI9VkyvlMaLfMibriqY73\nzBbPzf6Bkp2+Y9qyzuveYMmwS4sEOuZL/PetqisWe9JGAWD/O+slQ2KRu9hNww06\nKMDPJRdyj5bRuBVE4hHkkP23KrYr7SuhW2vpe7O/MvWEJ9uDNegpMLhTWruGngJh\niFndxegN9w==\n=bAuo\n-----END PGP MESSAGE-----\n',
'foo': '-----BEGIN PGP MESSAGE-----\n'
'\n'
'hQEMAw2B674HRhwSAQgAhTrN8NizwUv/VunVrqa4/X8t6EUulrnhKcSeb8sZS4th\n'
'W1Qz3K2NjL4lkUHCQHKZVx/VoZY7zsddBIFvvoGGfj8+2wjkEDwFmFjGE4DEsS74\n'
'ZLRFIFJC1iB/O0AiQ+oU745skQkU6OEKxqavmKMrKo3rvJ8ZCXDC470+i2/Hqrp7\n'
'+KWGmaDOO422JaSKRm5D9bQZr9oX7KqnrPG9I1+UbJyQSJdsdtquPWmeIpamEVHb\n'
'VMDNQRjSezZ1yKC4kCWm3YQbBF76qTHzG1VlLF5qOzuGI9VkyvlMaLfMibriqY73\n'
'zBbPzf6Bkp2+Y9qyzuveYMmwS4sEOuZL/PetqisWe9JGAWD/O+slQ2KRu9hNww06\n'
'KMDPJRdyj5bRuBVE4hHkkP23KrYr7SuhW2vpe7O/MvWEJ9uDNegpMLhTWruGngJh\n'
'iFndxegN9w==\n'
'=bAuo\n'
'-----END PGP MESSAGE-----\n',
'bar': 'this was unencrypted already',
'baz': '-----BEGIN PGP MESSAGE-----\n\nhQEMAw2B674HRhwSAQf+Ne+IfsP2IcPDrUWct8sTJrga47jQvlPCmO+7zJjOVcqz\ngLjUKvMajrbI/jorBWxyAbF+5E7WdG9WHHVnuoywsyTB9rbmzuPqYCJCe+ZVyqWf\n9qgJ+oUjcvYIFmH3h7H68ldqbxaAUkAOQbTRHdr253wwaTIC91ZeX0SCj64HfTg7\nIzwk383CRWonEktXJpientApQFSUWNeLUWagEr/YPNFA3vzpPF5/Ia9X8/z/6oO2\nq+D5W5mVsns3i2HHbg2A8Y+pm4TWnH6mTSh/gdxPqssi9qIrzGQ6H1tEoFFOEq1V\nkJBe0izlfudqMq62XswzuRB4CYT5Iqw1c97T+1RqENJCASG0Wz8AGhinTdlU5iQl\nJkLKqBxcBz4L70LYWyHhYwYROJWjHgKAywX5T67ftq0wi8APuZl9olnOkwSK+wrY\n1OZi\n=7epf\n-----END PGP MESSAGE-----\n',
'baz': '-----BEGIN PGP MESSAGE-----\n'
'\n'
'hQEMAw2B674HRhwSAQf+Ne+IfsP2IcPDrUWct8sTJrga47jQvlPCmO+7zJjOVcqz\n'
'gLjUKvMajrbI/jorBWxyAbF+5E7WdG9WHHVnuoywsyTB9rbmzuPqYCJCe+ZVyqWf\n'
'9qgJ+oUjcvYIFmH3h7H68ldqbxaAUkAOQbTRHdr253wwaTIC91ZeX0SCj64HfTg7\n'
'Izwk383CRWonEktXJpientApQFSUWNeLUWagEr/YPNFA3vzpPF5/Ia9X8/z/6oO2\n'
'q+D5W5mVsns3i2HHbg2A8Y+pm4TWnH6mTSh/gdxPqssi9qIrzGQ6H1tEoFFOEq1V\n'
'kJBe0izlfudqMq62XswzuRB4CYT5Iqw1c97T+1RqENJCASG0Wz8AGhinTdlU5iQl\n'
'JkLKqBxcBz4L70LYWyHhYwYROJWjHgKAywX5T67ftq0wi8APuZl9olnOkwSK+wrY\n'
'1OZi\n'
'=7epf\n'
'-----END PGP MESSAGE-----\n',
'qux': [
'foo',
'bar',
'-----BEGIN PGP MESSAGE-----\n\nhQEMAw2B674HRhwSAQgAg1YCmokrweoOI1c9HO0BLamWBaFPTMblOaTo0WJLZoTS\nksbQ3OJAMkrkn3BnnM/djJc5C7vNs86ZfSJ+pvE8Sp1Rhtuxh25EKMqGOn/SBedI\ngR6N5vGUNiIpG5Tf3DuYAMNFDUqw8uY0MyDJI+ZW3o3xrMUABzTH0ew+Piz85FDA\nYrVgwZfqyL+9OQuu6T66jOIdwQNRX2NPFZqvon8liZUPus5VzD8E5cAL9OPxQ3sF\nf7/zE91YIXUTimrv3L7eCgU1dSxKhhfvA2bEUi+AskMWFXFuETYVrIhFJAKnkFmE\nuZx+O9R9hADW3hM5hWHKH9/CRtb0/cC84I9oCWIQPdI+AaPtICxtsD2N8Q98hhhd\n4M7I0sLZhV+4ZJqzpUsOnSpaGyfh1Zy/1d3ijJi99/l+uVHuvmMllsNmgR+ZTj0=\n=LrCQ\n-----END PGP MESSAGE-----\n'
'-----BEGIN PGP MESSAGE-----\n'
'\n'
'hQEMAw2B674HRhwSAQgAg1YCmokrweoOI1c9HO0BLamWBaFPTMblOaTo0WJLZoTS\n'
'ksbQ3OJAMkrkn3BnnM/djJc5C7vNs86ZfSJ+pvE8Sp1Rhtuxh25EKMqGOn/SBedI\n'
'gR6N5vGUNiIpG5Tf3DuYAMNFDUqw8uY0MyDJI+ZW3o3xrMUABzTH0ew+Piz85FDA\n'
'YrVgwZfqyL+9OQuu6T66jOIdwQNRX2NPFZqvon8liZUPus5VzD8E5cAL9OPxQ3sF\n'
'f7/zE91YIXUTimrv3L7eCgU1dSxKhhfvA2bEUi+AskMWFXFuETYVrIhFJAKnkFmE\n'
'uZx+O9R9hADW3hM5hWHKH9/CRtb0/cC84I9oCWIQPdI+AaPtICxtsD2N8Q98hhhd\n'
'4M7I0sLZhV+4ZJqzpUsOnSpaGyfh1Zy/1d3ijJi99/l+uVHuvmMllsNmgR+ZTj0=\n'
'=LrCQ\n'
'-----END PGP MESSAGE-----\n'
],
},
},
@ -416,7 +448,15 @@ class DecryptGPGPillarTest(ModuleCase):
'Failed to decrypt pillar key \'secrets:vault\': Decryption '
'renderer \'asdf\' is not available'
]
self.assertEqual(ret, expected)
self.assertEqual(ret['_errors'], expected['_errors'])
self.assertEqual(ret['secrets']['vault']['foo'],
expected['secrets']['vault']['foo'])
self.assertEqual(ret['secrets']['vault']['bar'],
expected['secrets']['vault']['bar'])
self.assertEqual(ret['secrets']['vault']['baz'],
expected['secrets']['vault']['baz'])
self.assertEqual(ret['secrets']['vault']['qux'],
expected['secrets']['vault']['qux'])
@requires_system_grains
def test_decrypt_pillar_invalid_renderer(self, grains=None):
@ -441,4 +481,12 @@ class DecryptGPGPillarTest(ModuleCase):
'Failed to decrypt pillar key \'secrets:vault\': \'gpg\' is '
'not a valid decryption renderer. Valid choices are: foo, bar'
]
self.assertEqual(ret, expected)
self.assertEqual(ret['_errors'], expected['_errors'])
self.assertEqual(ret['secrets']['vault']['foo'],
expected['secrets']['vault']['foo'])
self.assertEqual(ret['secrets']['vault']['bar'],
expected['secrets']['vault']['bar'])
self.assertEqual(ret['secrets']['vault']['baz'],
expected['secrets']['vault']['baz'])
self.assertEqual(ret['secrets']['vault']['qux'],
expected['secrets']['vault']['qux'])

View file

@ -31,11 +31,12 @@ class StatusBeaconTestCase(TestCase, LoaderModuleMockMixin):
def setup_loader_modules(self):
opts = salt.config.DEFAULT_MINION_OPTS
opts['grains'] = salt.loader.grains(opts)
module_globals = {
'__opts__': opts,
'__salt__': 'autoload',
'__context__': {},
'__grains__': {'kernel': 'Linux'}
'__grains__': opts['grains']
}
return {
status: module_globals,

View file

@ -46,6 +46,8 @@ class MockRunnerClient(object):
'''
Mock cmd method
'''
# TODO: Figure out how to have this return an empty dict or a dict
# TODO: with expected data
return []
@ -64,29 +66,54 @@ class WinrepoTestCase(TestCase, LoaderModuleMockMixin):
'''
Test to refresh the winrepo.p file of the repository
'''
ret = {'name': 'salt',
'changes': {},
'result': False,
'comment': ''}
ret.update({'comment': '{0} is missing'.format(
os.sep.join([BASE_FILE_ROOTS_DIR, 'win', 'repo']))})
self.assertDictEqual(winrepo.genrepo('salt'), ret)
expected = {'name': 'salt',
'changes': {},
'result': False,
'comment': ''}
mock_config = MagicMock(return_value={'winrepo_dir': 'salt',
'winrepo_cachefile': 'abc'})
mock_stat = MagicMock(return_value=[0, 1, 2, 3, 4, 5, 6, 7, 8])
mock_empty_list = MagicMock(return_value=[])
with patch.object(salt.config, 'master_config', mock_config), \
patch.object(os, 'stat', mock_stat), \
patch.object(salt.utils.path, 'os_walk', mock_empty_list), \
patch.dict(winrepo.__opts__, {'test': True}):
# With test=True
expected.update({'comment': '', 'result': None})
self.assertDictEqual(winrepo.genrepo('salt'), expected)
mock = MagicMock(return_value={'winrepo_dir': 'salt',
'winrepo_cachefile': 'abc'})
with patch.object(salt.config, 'master_config', mock):
mock = MagicMock(return_value=[0, 1, 2, 3, 4, 5, 6, 7, 8])
with patch.object(os, 'stat', mock):
mock = MagicMock(return_value=[])
with patch.object(salt.utils.path, 'os_walk', mock):
with patch.dict(winrepo.__opts__, {'test': True}):
ret.update({'comment': '', 'result': None})
self.assertDictEqual(winrepo.genrepo('salt'), ret)
with patch.dict(winrepo.__opts__, {'test': False}):
# With test=False
expected.update({'result': True})
self.assertDictEqual(winrepo.genrepo('salt'), expected)
with patch.dict(winrepo.__opts__, {'test': False}):
ret.update({'result': True})
self.assertDictEqual(winrepo.genrepo('salt'), ret)
# Now with no changes, existing winrepo.p
expected.update({'changes': {'winrepo': []}})
self.assertDictEqual(winrepo.genrepo('salt', True), expected)
ret.update({'changes': {'winrepo': []}})
self.assertDictEqual(winrepo.genrepo('salt', True),
ret)
def test_genrepo_no_dir(self):
'''
Test genrepo when the dir does not exist
'''
expected = {'name': 'salt',
'changes': {},
'result': False,
'comment': '{0} is missing'.format(
os.sep.join([BASE_FILE_ROOTS_DIR, 'win', 'repo']))}
with patch.dict(winrepo.__opts__, {'test': False}), \
patch('os.path.exists', MagicMock(return_value=False)):
ret = winrepo.genrepo('salt')
self.assertDictEqual(ret, expected)
def test_genrepo_no_dir_force(self):
'''
Test genrepo when the dir does not exist and force=True
'''
expected = {'name': 'salt',
'changes': {'winrepo': []},
'result': True,
'comment': ''}
with patch.dict(winrepo.__opts__, {'test': False}), \
patch('os.path.exists', MagicMock(return_value=False)):
ret = winrepo.genrepo('salt', force=True)
self.assertDictEqual(ret, expected)