def test__load_tab(self): cron.__grains__ = __grains__ with patch.dict(cron.__grains__, {'os_family': 'Solaris'}): crons1 = cron.list_tab('root') crons2 = cron.list_tab('root') crons3 = cron.list_tab('root') crons4 = cron.list_tab('root') crons5 = cron.list_tab('root') self.assertEqual( crons1, {'pre': [], 'crons': [], 'env': [], 'special': []}) self.assertEqual( crons2['crons'][0], {'comment': None, 'commented': False, 'dayweek': '*', 'hour': '*', 'identifier': None, 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'}) self.assertEqual( crons3['crons'][0], {'comment': 'commented', 'commented': True, 'dayweek': '*', 'hour': '*', 'identifier': None, 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'}) self.assertEqual( crons4['crons'][0], {'comment': 'foo', 'commented': False, 'dayweek': '*', 'hour': '*', 'identifier': None, 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'}) self.assertEqual( crons5['crons'][0], {'comment': 'foo', 'commented': False, 'dayweek': '*', 'hour': '*', 'identifier': 'blah', 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'})
def test_cron_extra_spaces(self): ''' Issue #38449 ''' with patch.dict(cron.__grains__, {'os': None}), \ patch('salt.modules.cron.raw_cron', MagicMock(return_value=STUB_CRON_SPACES)): ret = cron.list_tab('root') eret = { 'crons': [{ 'cmd': 'echo "must be double spaced"', 'comment': '', 'commented': False, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'echo "must be double spaced"', 'minute': '11', 'month': '*' }], 'env': [{ 'name': 'TEST_VAR', 'value': '"a string with plenty of spaces"' }], 'pre': [''], 'special': [] } self.assertEqual(eret, ret)
def test_cron_extra_spaces(self): ''' Issue #38449 ''' self.maxDiff = None with patch.dict(cron.__grains__, {'os': None}): ret = cron.list_tab('root') eret = { 'crons': [{ 'cmd': 'echo "must be double spaced"', 'comment': '', 'commented': False, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'echo "must be double spaced"', 'minute': '11', 'month': '*' }], 'env': [{ 'name': 'TEST_VAR', 'value': '"a string with plenty of spaces"' }], 'pre': [''], 'special': [] } self.assertEqual(eret, ret)
def test_cron_at_sign(self): with patch.dict(cron.__grains__, {'os': None}), \ patch('salt.modules.cron.raw_cron', MagicMock(return_value=STUB_AT_SIGN)): ret = cron.list_tab('root') eret = {'crons': [], 'env': [], 'pre': [''], 'special': [{u'cmd': u'echo "cron with @ sign"', u'comment': u'', u'commented': False, u'identifier': u'echo "cron with @ sign"', u'spec': u'@daily'}]} self.assertDictEqual(eret, ret)
def test_list_tab_commented_cron_jobs(self): ''' handle commented cron jobs https://github.com/saltstack/salt/issues/29082 ''' self.maxDiff = None with patch( 'salt.modules.cron.raw_cron', new=MagicMock(side_effect=get_crontab) ): set_crontab( '# An unmanaged commented cron job\n' '#0 * * * * /bin/true\n' '# Lines below here are managed by Salt, do not edit\n' '# cron_1 SALT_CRON_IDENTIFIER:cron_1\n#DISABLED#0 * * * * my_cmd_1\n' '# cron_2 SALT_CRON_IDENTIFIER:cron_2\n#DISABLED#* * * * * my_cmd_2\n' '# cron_3 SALT_CRON_IDENTIFIER:cron_3\n' '#DISABLED#but it is a comment line' '#DISABLED#0 * * * * my_cmd_3\n' '# cron_4 SALT_CRON_IDENTIFIER:cron_4\n0 * * * * my_cmd_4\n' ) crons1 = cron.list_tab('root') self.assertEqual(crons1, { 'crons': [ {'cmd': 'my_cmd_1', 'comment': 'cron_1', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'cron_1', 'minute': '0', 'month': '*', 'commented': True}, {'cmd': 'my_cmd_2', 'comment': 'cron_2', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'cron_2', 'minute': '*', 'month': '*', 'commented': True}, {'cmd': 'line#DISABLED#0 * * * * my_cmd_3', 'comment': 'cron_3', 'daymonth': 'is', 'dayweek': 'comment', 'hour': 'it', 'identifier': 'cron_3', 'minute': 'but', 'month': 'a', 'commented': True}, {'cmd': 'my_cmd_4', 'comment': 'cron_4', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'cron_4', 'minute': '0', 'month': '*', 'commented': False}, ], 'env': [], 'pre': ['# An unmanaged commented cron job', '#0 * * * * /bin/true'], 'special': []})
def test_list_tab(self): self.assertDictEqual(STUB_SIMPLE_CRON_DICT, cron.list_tab('DUMMY_USER'))
def test__issue10959(self): ''' handle multi old style crontabs https://github.com/saltstack/salt/issues/10959 ''' with patch('salt.modules.cron.raw_cron', new=MagicMock(side_effect=get_crontab)): set_crontab( '# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' # as managed per salt, the last lines will be merged together ! '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * samecmd\n' '* * * * * otheridcmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n0 * * * * samecmd1\n' '1 * * * * samecmd1\n' '0 * * * * otheridcmd1\n' '1 * * * * otheridcmd1\n' # special case here, none id managed line with same command # as a later id managed line will become managed '# SALT_CRON_IDENTIFIER:1\n0 * * * * otheridcmd1\n' '# SALT_CRON_IDENTIFIER:2\n0 * * * * otheridcmd1\n') crons1 = cron.list_tab('root') # the filtering is done on save, we reflect in listing # the same that we have in a file, no matter what we # have self.assertEqual( crons1, { 'crons': [{ 'cmd': 'ls', 'comment': 'uoo', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*' }, { 'cmd': 'too', 'comment': 'uuoo', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*' }, { 'cmd': 'zoo', 'comment': 'uuuoo', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*' }, { 'cmd': 'yoo', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*' }, { 'cmd': 'xoo', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*' }, { 'cmd': 'samecmd', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*' }, { 'cmd': 'samecmd', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '*', 'month': '*' }, { 'cmd': 'otheridcmd', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '*', 'month': '*' }, { 'cmd': 'otheridcmd', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '*', 'month': '*' }, { 'cmd': 'samecmd1', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '0', 'month': '*' }, { 'cmd': 'samecmd1', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '1', 'month': '*' }, { 'cmd': 'otheridcmd1', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '0', 'month': '*' }, { 'cmd': 'otheridcmd1', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '1', 'month': '*' }, { 'cmd': 'otheridcmd1', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': '1', 'minute': '0', 'month': '*' }, { 'cmd': 'otheridcmd1', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': '2', 'minute': '0', 'month': '*' }], 'env': [], 'pre': [], 'special': [] }) # so yood so far, no problem for now, trying to save the # multilines without id crons now inc_tests = [ ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n' '0 * * * * samecmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '0 * * * * otheridcmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '1 * * * * otheridcmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '# SALT_CRON_IDENTIFIER:1\n0 * * * * otheridcmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '# SALT_CRON_IDENTIFIER:1\n0 * * * * otheridcmd1\n' '# SALT_CRON_IDENTIFIER:2\n0 * * * * otheridcmd1') ] set_crontab('') for idx, cr in enumerate(crons1['crons']): cron.set_job('root', **cr) self.assertEqual(get_crontab(), inc_tests[idx], ("idx {0}\n'{1}'\n != \n'{2}'\n\n\n" "\'{1}\' != \'{2}\'").format( idx, get_crontab(), inc_tests[idx]))
def test_list_tab(self): with patch('salt.modules.cron.raw_cron', new=MagicMock(return_value=STUB_SIMPLE_RAW_CRON)): self.assertDictEqual(STUB_SIMPLE_CRON_DICT, cron.list_tab('DUMMY_USER'))
def test__load_tab(self): with patch.dict(cron.__grains__, {'os_family': 'Solaris'}), \ patch('salt.modules.cron.raw_cron', new=MagicMock(side_effect=[ (L + '\n'), (L + '* * * * * ls\nn'), (L + '# commented\n' '#DISABLED#* * * * * ls\n'), (L + '# foo\n' '* * * * * ls\n'), (L + '# foo {0}:blah\n'.format( cron.SALT_CRON_IDENTIFIER) + '* * * * * ls\n')])): crons1 = cron.list_tab('root') crons2 = cron.list_tab('root') crons3 = cron.list_tab('root') crons4 = cron.list_tab('root') crons5 = cron.list_tab('root') self.assertEqual( crons1, {'pre': [], 'crons': [], 'env': [], 'special': []}) self.assertEqual( crons2['crons'][0], {'comment': None, 'commented': False, 'dayweek': '*', 'hour': '*', 'identifier': None, 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'}) self.assertEqual( crons3['crons'][0], {'comment': 'commented', 'commented': True, 'dayweek': '*', 'hour': '*', 'identifier': None, 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'}) self.assertEqual( crons4['crons'][0], {'comment': 'foo', 'commented': False, 'dayweek': '*', 'hour': '*', 'identifier': None, 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'}) self.assertEqual( crons5['crons'][0], {'comment': 'foo', 'commented': False, 'dayweek': '*', 'hour': '*', 'identifier': 'blah', 'cmd': 'ls', 'daymonth': '*', 'minute': '*', 'month': '*'})
def test__issue10959(self): ''' handle multi old style crontabs https://github.com/saltstack/salt/issues/10959 ''' with patch( 'salt.modules.cron.raw_cron', new=MagicMock(side_effect=get_crontab) ): set_crontab( '# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' # as managed per salt, the last lines will be merged together ! '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * samecmd\n' '* * * * * otheridcmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n0 * * * * samecmd1\n' '1 * * * * samecmd1\n' '0 * * * * otheridcmd1\n' '1 * * * * otheridcmd1\n' # special case here, none id managed line with same command # as a later id managed line will become managed '# SALT_CRON_IDENTIFIER:1\n0 * * * * otheridcmd1\n' '# SALT_CRON_IDENTIFIER:2\n0 * * * * otheridcmd1\n' ) crons1 = cron.list_tab('root') # the filtering is done on save, we reflect in listing # the same that we have in a file, no matter what we # have self.assertEqual(crons1, { 'crons': [ {'cmd': 'ls', 'comment': 'uoo', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*'}, {'cmd': 'too', 'comment': 'uuoo', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*'}, {'cmd': 'zoo', 'comment': 'uuuoo', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*'}, {'cmd': 'yoo', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*'}, {'cmd': 'xoo', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*'}, {'cmd': 'samecmd', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '*', 'month': '*'}, {'cmd': 'samecmd', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '*', 'month': '*'}, {'cmd': 'otheridcmd', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '*', 'month': '*'}, {'cmd': 'otheridcmd', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '*', 'month': '*'}, {'cmd': 'samecmd1', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': 'NO ID SET', 'minute': '0', 'month': '*'}, {'cmd': 'samecmd1', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '1', 'month': '*'}, {'cmd': 'otheridcmd1', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '0', 'month': '*'}, {'cmd': 'otheridcmd1', 'comment': None, 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': None, 'minute': '1', 'month': '*'}, {'cmd': 'otheridcmd1', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': '1', 'minute': '0', 'month': '*'}, {'cmd': 'otheridcmd1', 'comment': '', 'daymonth': '*', 'dayweek': '*', 'hour': '*', 'identifier': '2', 'minute': '0', 'month': '*'} ], 'env': [], 'pre': [], 'special': []}) # so yood so far, no problem for now, trying to save the # multilines without id crons now inc_tests = [ ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n' '0 * * * * samecmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '0 * * * * otheridcmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '1 * * * * otheridcmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '# SALT_CRON_IDENTIFIER:1\n0 * * * * otheridcmd1'), # ('# Lines below here are managed by Salt, do not edit\n' '# uoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * ls\n' '# uuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * too\n' '# uuuoo SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * zoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * yoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * xoo\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n* * * * * samecmd\n' '* * * * * otheridcmd\n' '# SALT_CRON_IDENTIFIER:NO ID SET\n1 * * * * samecmd1\n' '# SALT_CRON_IDENTIFIER:1\n0 * * * * otheridcmd1\n' '# SALT_CRON_IDENTIFIER:2\n0 * * * * otheridcmd1') ] set_crontab('') for idx, cr in enumerate(crons1['crons']): cron.set_job('root', **cr) self.assertEqual( get_crontab(), inc_tests[idx], ( "idx {0}\n '{1}'\n != \n'{2}'\n\n\n" "{1!r} != {2!r}" ).format( idx, get_crontab(), inc_tests[idx]))