2012-05-05 14:09:23 +00:00
|
|
|
# Import python libs
|
2012-08-25 23:38:39 +00:00
|
|
|
import os
|
2012-09-28 15:04:38 +00:00
|
|
|
import shutil
|
2012-11-18 18:57:10 +00:00
|
|
|
|
|
|
|
# Import salt libs
|
2012-11-18 19:06:17 +00:00
|
|
|
import salt.utils
|
2012-03-29 23:18:32 +00:00
|
|
|
import integration
|
2012-05-05 14:09:23 +00:00
|
|
|
|
2012-03-29 23:18:32 +00:00
|
|
|
|
|
|
|
class StateModuleTest(integration.ModuleCase):
|
|
|
|
'''
|
|
|
|
Validate the test module
|
|
|
|
'''
|
2012-09-01 06:49:34 +00:00
|
|
|
|
|
|
|
maxDiff = None
|
|
|
|
|
2012-03-29 23:18:32 +00:00
|
|
|
def test_show_highstate(self):
|
|
|
|
'''
|
|
|
|
state.show_highstate
|
|
|
|
'''
|
|
|
|
high = self.run_function('state.show_highstate')
|
|
|
|
self.assertTrue(isinstance(high, dict))
|
|
|
|
self.assertTrue('/testfile' in high)
|
|
|
|
self.assertEqual(high['/testfile']['__env__'], 'base')
|
|
|
|
|
|
|
|
def test_show_lowstate(self):
|
|
|
|
'''
|
|
|
|
state.show_lowstate
|
|
|
|
'''
|
|
|
|
low = self.run_function('state.show_lowstate')
|
|
|
|
self.assertTrue(isinstance(low, list))
|
|
|
|
self.assertTrue(isinstance(low[0], dict))
|
|
|
|
|
2012-05-14 03:31:46 +00:00
|
|
|
def test_catch_recurse(self):
|
|
|
|
'''
|
|
|
|
state.show_sls used to catch a recursive ref
|
|
|
|
'''
|
|
|
|
err = self.run_function('state.sls', mods='recurse_fail')
|
2012-05-14 05:16:45 +00:00
|
|
|
self.assertIn('recursive', err[0])
|
2012-05-14 03:31:46 +00:00
|
|
|
|
2012-06-16 04:41:36 +00:00
|
|
|
def test_no_recurse(self):
|
|
|
|
'''
|
2012-06-19 16:29:14 +00:00
|
|
|
verify that a sls structure is NOT a recursive ref
|
2012-06-16 04:41:36 +00:00
|
|
|
'''
|
|
|
|
sls = self.run_function('state.show_sls', mods='recurse_ok')
|
|
|
|
self.assertIn('snmpd', sls)
|
|
|
|
|
2012-06-19 16:29:14 +00:00
|
|
|
def test_no_recurse_two(self):
|
|
|
|
'''
|
|
|
|
verify that a sls structure is NOT a recursive ref
|
|
|
|
'''
|
|
|
|
sls = self.run_function('state.show_sls', mods='recurse_ok_two')
|
|
|
|
self.assertIn('/etc/nagios/nrpe.cfg', sls)
|
|
|
|
|
2012-09-01 06:49:34 +00:00
|
|
|
def test_issue_1896_file_append_source(self):
|
|
|
|
'''
|
|
|
|
Verify that we can append a file's contents
|
|
|
|
'''
|
2012-11-06 11:20:06 +00:00
|
|
|
testfile = os.path.join(integration.TMP, 'test.append')
|
|
|
|
if os.path.isfile(testfile):
|
|
|
|
os.unlink(testfile)
|
|
|
|
|
|
|
|
ret = self.run_function('state.sls', mods='testappend')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
|
|
|
|
ret = self.run_function('state.sls', mods='testappend.step-1')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
|
|
|
|
ret = self.run_function('state.sls', mods='testappend.step-2')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
2012-11-04 11:35:23 +00:00
|
|
|
|
2012-09-28 23:40:30 +00:00
|
|
|
self.assertMultiLineEqual('''\
|
2012-09-01 06:49:34 +00:00
|
|
|
# set variable identifying the chroot you work in (used in the prompt below)
|
|
|
|
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
|
|
|
|
debian_chroot=$(cat /etc/debian_chroot)
|
|
|
|
fi
|
2012-09-03 15:40:52 +00:00
|
|
|
|
2012-09-01 06:49:34 +00:00
|
|
|
# enable bash completion in interactive shells
|
|
|
|
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
|
|
|
|
. /etc/bash_completion
|
|
|
|
fi
|
2012-11-18 18:57:10 +00:00
|
|
|
''', salt.utils.fopen(testfile, 'r').read())
|
2012-09-01 06:49:34 +00:00
|
|
|
|
|
|
|
# Re-append switching order
|
2012-11-06 11:20:06 +00:00
|
|
|
ret = self.run_function('state.sls', mods='testappend.step-2')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
|
|
|
|
ret = self.run_function('state.sls', mods='testappend.step-1')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
|
2012-09-28 23:40:30 +00:00
|
|
|
self.assertMultiLineEqual('''\
|
2012-09-01 06:49:34 +00:00
|
|
|
# set variable identifying the chroot you work in (used in the prompt below)
|
|
|
|
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
|
|
|
|
debian_chroot=$(cat /etc/debian_chroot)
|
|
|
|
fi
|
2012-09-03 15:40:52 +00:00
|
|
|
|
2012-09-01 06:49:34 +00:00
|
|
|
# enable bash completion in interactive shells
|
|
|
|
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
|
|
|
|
. /etc/bash_completion
|
|
|
|
fi
|
2012-11-18 18:57:10 +00:00
|
|
|
''', salt.utils.fopen(testfile, 'r').read())
|
2012-09-01 06:49:34 +00:00
|
|
|
|
2012-08-25 13:44:07 +00:00
|
|
|
def test_issue_1876_syntax_error(self):
|
|
|
|
'''
|
|
|
|
verify that we catch the following syntax error::
|
|
|
|
|
|
|
|
/tmp/salttest/issue-1876:
|
|
|
|
|
|
|
|
file:
|
|
|
|
- managed
|
|
|
|
- source: salt://testfile
|
|
|
|
|
|
|
|
file.append:
|
|
|
|
- text: foo
|
|
|
|
|
|
|
|
'''
|
2012-11-06 11:20:06 +00:00
|
|
|
testfile = os.path.join(integration.TMP, 'issue-1876')
|
2012-08-25 13:44:07 +00:00
|
|
|
sls = self.run_function('state.sls', mods='issue-1876')
|
|
|
|
self.assertIn(
|
2012-11-06 11:20:06 +00:00
|
|
|
'Name "{0}" in sls "issue-1876" contains multiple state decs of '
|
|
|
|
'the same type'.format(testfile),
|
|
|
|
sls
|
2012-08-25 13:44:07 +00:00
|
|
|
)
|
|
|
|
|
2012-08-25 23:38:39 +00:00
|
|
|
def test_issue_1879_too_simple_contains_check(self):
|
2012-09-28 23:40:30 +00:00
|
|
|
contents = '''\
|
2012-08-25 23:38:39 +00:00
|
|
|
# set variable identifying the chroot you work in (used in the prompt below)
|
|
|
|
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
|
|
|
|
debian_chroot=$(cat /etc/debian_chroot)
|
|
|
|
fi
|
|
|
|
# enable bash completion in interactive shells
|
|
|
|
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
|
|
|
|
. /etc/bash_completion
|
2012-08-28 09:03:11 +00:00
|
|
|
fi
|
2012-09-28 23:40:30 +00:00
|
|
|
'''
|
2012-11-06 11:20:06 +00:00
|
|
|
testfile = os.path.join(integration.TMP, 'issue-1879')
|
2012-11-04 11:46:00 +00:00
|
|
|
# Delete if exiting
|
2012-11-06 11:20:06 +00:00
|
|
|
if os.path.isfile(testfile):
|
|
|
|
os.unlink(testfile)
|
2012-11-04 11:46:00 +00:00
|
|
|
|
2012-08-28 09:03:11 +00:00
|
|
|
# Create the file
|
2012-11-06 11:20:06 +00:00
|
|
|
ret = self.run_function('state.sls', mods='issue-1879')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
|
2012-08-28 09:03:11 +00:00
|
|
|
# The first append
|
2012-11-06 11:20:06 +00:00
|
|
|
ret = self.run_function('state.sls', mods='issue-1879.step-1')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
|
|
|
|
# The second append
|
|
|
|
ret = self.run_function('state.sls', mods='issue-1879.step-2')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
|
2012-08-28 09:03:11 +00:00
|
|
|
# Does it match?
|
|
|
|
try:
|
|
|
|
self.assertMultiLineEqual(
|
2012-11-06 11:20:06 +00:00
|
|
|
contents,
|
2012-11-18 18:57:10 +00:00
|
|
|
salt.utils.fopen(testfile, 'r').read()
|
2012-08-28 09:03:11 +00:00
|
|
|
)
|
|
|
|
# Make sure we don't re-append existing text
|
2012-11-06 11:20:06 +00:00
|
|
|
ret = self.run_function('state.sls', mods='issue-1879.step-1')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
|
|
|
ret = self.run_function('state.sls', mods='issue-1879.step-2')
|
|
|
|
try:
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
except AssertionError:
|
|
|
|
print ret
|
|
|
|
raise
|
2012-08-28 09:03:11 +00:00
|
|
|
self.assertMultiLineEqual(
|
2012-11-06 11:20:06 +00:00
|
|
|
contents,
|
2012-11-18 18:57:10 +00:00
|
|
|
salt.utils.fopen(testfile, 'r').read()
|
2012-08-28 09:03:11 +00:00
|
|
|
)
|
|
|
|
except Exception:
|
2012-11-06 11:20:06 +00:00
|
|
|
if os.path.exists(testfile):
|
|
|
|
shutil.copy(testfile, testfile + '.bak')
|
2012-08-28 09:03:11 +00:00
|
|
|
raise
|
|
|
|
finally:
|
2012-11-06 11:20:06 +00:00
|
|
|
if os.path.exists(testfile):
|
|
|
|
os.unlink(testfile)
|
2012-08-25 23:38:39 +00:00
|
|
|
|
2012-09-28 00:17:37 +00:00
|
|
|
def test_include(self):
|
2012-11-06 12:44:53 +00:00
|
|
|
fnames = (
|
|
|
|
os.path.join(integration.SYS_TMP_DIR, 'include-test'),
|
|
|
|
os.path.join(integration.SYS_TMP_DIR, 'to-include-test')
|
|
|
|
)
|
|
|
|
exclude_test_file = os.path.join(
|
|
|
|
integration.SYS_TMP_DIR, 'exclude-test'
|
|
|
|
)
|
2012-09-28 00:17:37 +00:00
|
|
|
try:
|
|
|
|
ret = self.run_function('state.sls', mods='include-test')
|
|
|
|
for part in ret.itervalues():
|
|
|
|
self.assertTrue(part['result'])
|
|
|
|
for fname in fnames:
|
|
|
|
self.assertTrue(os.path.isfile(fname))
|
2012-11-06 12:44:53 +00:00
|
|
|
self.assertFalse(os.path.isfile(exclude_test_file))
|
2012-09-28 00:17:37 +00:00
|
|
|
finally:
|
2012-11-06 12:44:53 +00:00
|
|
|
for fname in list(fnames) + [exclude_test_file]:
|
2012-09-28 00:17:37 +00:00
|
|
|
if os.path.isfile(fname):
|
|
|
|
os.remove(fname)
|
|
|
|
|
|
|
|
def test_exclude(self):
|
2012-11-06 12:44:53 +00:00
|
|
|
fnames = (
|
|
|
|
os.path.join(integration.SYS_TMP_DIR, 'include-test'),
|
|
|
|
os.path.join(integration.SYS_TMP_DIR, 'exclude-test')
|
|
|
|
)
|
|
|
|
to_include_test_file = os.path.join(
|
|
|
|
integration.SYS_TMP_DIR, 'to-include-test'
|
|
|
|
)
|
2012-09-28 00:17:37 +00:00
|
|
|
try:
|
|
|
|
ret = self.run_function('state.sls', mods='exclude-test')
|
|
|
|
for part in ret.itervalues():
|
|
|
|
self.assertTrue(part['result'])
|
|
|
|
for fname in fnames:
|
|
|
|
self.assertTrue(os.path.isfile(fname))
|
2012-11-06 12:44:53 +00:00
|
|
|
self.assertFalse(os.path.isfile(to_include_test_file))
|
2012-09-28 00:17:37 +00:00
|
|
|
finally:
|
2012-11-06 12:44:53 +00:00
|
|
|
for fname in list(fnames) + [to_include_test_file]:
|
2012-09-28 00:17:37 +00:00
|
|
|
if os.path.isfile(fname):
|
|
|
|
os.remove(fname)
|
|
|
|
|
2012-09-28 15:04:38 +00:00
|
|
|
def test_issue_2068_template_str(self):
|
2012-11-06 12:44:53 +00:00
|
|
|
venv_dir = os.path.join(
|
|
|
|
integration.SYS_TMP_DIR, 'issue-2068-template-str'
|
|
|
|
)
|
2012-09-28 00:17:37 +00:00
|
|
|
|
2012-09-28 15:04:38 +00:00
|
|
|
try:
|
|
|
|
ret = self.run_function(
|
|
|
|
'state.sls', mods='issue-2068-template-str-no-dot'
|
|
|
|
)
|
|
|
|
self.assertTrue(isinstance(ret, dict))
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
for part in ret.itervalues():
|
|
|
|
self.assertTrue(part['result'])
|
|
|
|
finally:
|
|
|
|
if os.path.isdir(venv_dir):
|
|
|
|
shutil.rmtree(venv_dir)
|
|
|
|
|
|
|
|
# Let's load the template from the filesystem. If running this state
|
|
|
|
# with state.sls works, so should using state.template_str
|
|
|
|
template_path = os.path.join(
|
|
|
|
os.path.dirname(os.path.dirname(__file__)),
|
|
|
|
'files', 'file', 'base', 'issue-2068-template-str-no-dot.sls'
|
|
|
|
)
|
|
|
|
|
2012-11-18 18:57:10 +00:00
|
|
|
template = salt.utils.fopen(template_path, 'r').read()
|
2012-09-28 15:04:38 +00:00
|
|
|
try:
|
|
|
|
ret = self.run_function('state.template_str', [template])
|
|
|
|
|
2012-11-06 06:26:08 +00:00
|
|
|
self.assertTrue(isinstance(ret, dict))
|
2012-09-28 15:04:38 +00:00
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
|
|
|
|
self.assertTrue(
|
|
|
|
os.path.isfile(os.path.join(venv_dir, 'bin', 'pep8'))
|
|
|
|
)
|
|
|
|
finally:
|
|
|
|
if os.path.isdir(venv_dir):
|
|
|
|
shutil.rmtree(venv_dir)
|
|
|
|
|
2012-09-28 16:34:55 +00:00
|
|
|
# Now using state.template
|
|
|
|
try:
|
|
|
|
ret = self.run_function('state.template', [template_path])
|
|
|
|
self.assertTrue(isinstance(ret, dict))
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
for part in ret.itervalues():
|
|
|
|
self.assertTrue(part['result'])
|
|
|
|
finally:
|
|
|
|
if os.path.isdir(venv_dir):
|
|
|
|
shutil.rmtree(venv_dir)
|
|
|
|
|
2012-09-28 15:04:38 +00:00
|
|
|
# Now the problematic #2068 including dot's
|
|
|
|
try:
|
|
|
|
ret = self.run_function(
|
|
|
|
'state.sls', mods='issue-2068-template-str'
|
|
|
|
)
|
|
|
|
self.assertTrue(isinstance(ret, dict))
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
for part in ret.itervalues():
|
|
|
|
self.assertTrue(part['result'])
|
|
|
|
finally:
|
|
|
|
if os.path.isdir(venv_dir):
|
|
|
|
shutil.rmtree(venv_dir)
|
|
|
|
|
|
|
|
# Let's load the template from the filesystem. If running this state
|
|
|
|
# with state.sls works, so should using state.template_str
|
|
|
|
template_path = os.path.join(
|
|
|
|
os.path.dirname(os.path.dirname(__file__)),
|
|
|
|
'files', 'file', 'base', 'issue-2068-template-str.sls'
|
|
|
|
)
|
|
|
|
|
2012-11-18 18:57:10 +00:00
|
|
|
template = salt.utils.fopen(template_path, 'r').read()
|
2012-09-28 15:04:38 +00:00
|
|
|
try:
|
|
|
|
ret = self.run_function('state.template_str', [template])
|
|
|
|
|
|
|
|
self.assertTrue(isinstance(ret, dict)), ret
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
|
|
|
|
for key in ret.iterkeys():
|
|
|
|
self.assertTrue(ret[key]['result'])
|
|
|
|
|
|
|
|
self.assertTrue(
|
|
|
|
os.path.isfile(os.path.join(venv_dir, 'bin', 'pep8'))
|
|
|
|
)
|
|
|
|
finally:
|
|
|
|
if os.path.isdir(venv_dir):
|
|
|
|
shutil.rmtree(venv_dir)
|
2012-08-25 23:38:39 +00:00
|
|
|
|
2012-09-28 16:34:55 +00:00
|
|
|
# Now using state.template
|
|
|
|
try:
|
|
|
|
ret = self.run_function('state.template', [template_path])
|
|
|
|
self.assertTrue(isinstance(ret, dict))
|
|
|
|
self.assertNotEqual(ret, {})
|
|
|
|
for part in ret.itervalues():
|
|
|
|
self.assertTrue(part['result'])
|
|
|
|
finally:
|
|
|
|
if os.path.isdir(venv_dir):
|
|
|
|
shutil.rmtree(venv_dir)
|
|
|
|
|
2012-09-28 16:56:13 +00:00
|
|
|
def test_template_invalid_items(self):
|
|
|
|
TEMPLATE = '''\
|
|
|
|
{0}:
|
|
|
|
- issue-2068-template-str
|
|
|
|
|
|
|
|
/tmp/test-template-invalid-items:
|
|
|
|
file:
|
|
|
|
- managed
|
|
|
|
- source: salt://testfile
|
|
|
|
'''
|
|
|
|
for item in ('include', 'exclude', 'extends'):
|
|
|
|
ret = self.run_function(
|
|
|
|
'state.template_str', [TEMPLATE.format(item)]
|
|
|
|
)
|
|
|
|
self.assertTrue(isinstance(ret, list))
|
|
|
|
self.assertNotEqual(ret, [])
|
|
|
|
self.assertEqual(
|
|
|
|
['The \'{0}\' declaration found on \'<template-str>\' is '
|
|
|
|
'invalid when rendering single templates'.format(item)],
|
|
|
|
ret
|
|
|
|
)
|
|
|
|
|
2012-07-20 06:21:01 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
from integration import run_tests
|
|
|
|
run_tests(StateModuleTest)
|