Merge pull request #50187 from garethgreenaway/port_49871_to_2018_3

[2018.3] Adding fixes to scheduler tests to 2018.3
This commit is contained in:
Nicole Thomas 2018-10-24 15:45:31 -04:00 committed by GitHub
commit 462314b286
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 116 additions and 61 deletions

View file

@ -7,6 +7,7 @@ import datetime
import logging
import os
import random
import time
import dateutil.parser as dateutil_parser
import datetime
@ -22,6 +23,7 @@ import tests.integration as integration
# Import Salt libs
import salt.utils.schedule
import salt.utils.platform
from salt.modules.test import ping as ping
@ -60,9 +62,10 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
'''
verify that scheduled job runs
'''
job_name = 'test_eval'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'when': '11/29/2017 4:00pm',
}
@ -76,21 +79,22 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# Evaluate 1 second before the run time
self.schedule.eval(now=run_time1)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertNotIn('_last_run', ret)
# Evaluate 1 second at the run time
self.schedule.eval(now=run_time2)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time2)
def test_eval_multiple_whens(self):
'''
verify that scheduled job runs
'''
job_name = 'test_eval_multiple_whens'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'when': [
'11/29/2017 4:00pm',
@ -99,6 +103,9 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
}
}
}
if salt.utils.platform.is_darwin():
job['schedule'][job_name]['dry_run'] = True
run_time1 = dateutil_parser.parse('11/29/2017 4:00pm')
run_time2 = dateutil_parser.parse('11/29/2017 5:00pm')
@ -107,21 +114,24 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# Evaluate run time1
self.schedule.eval(now=run_time1)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time1)
time.sleep(2)
# Evaluate run time2
self.schedule.eval(now=run_time2)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time2)
def test_eval_loop_interval(self):
'''
verify that scheduled job runs
'''
job_name = 'test_eval_loop_interval'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'when': '11/29/2017 4:00pm',
}
@ -139,24 +149,28 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# Evaluate 1 second at the run time
self.schedule.eval(now=run_time2 + datetime.timedelta(seconds=LOOP_INTERVAL))
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time2 + datetime.timedelta(seconds=LOOP_INTERVAL))
def test_eval_multiple_whens_loop_interval(self):
'''
verify that scheduled job runs
'''
job_name = 'test_eval_multiple_whens_loop_interval'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'when': [
'11/29/2017 4:00pm',
'11/29/2017 5:00pm',
]
],
}
}
}
if salt.utils.platform.is_darwin():
job['schedule'][job_name]['dry_run'] = True
# 30 second loop interval
LOOP_INTERVAL = random.randint(30, 59)
self.schedule.opts['loop_interval'] = LOOP_INTERVAL
@ -169,21 +183,24 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# Evaluate 1 second at the run time
self.schedule.eval(now=run_time1)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time1)
time.sleep(2)
# Evaluate 1 second at the run time
self.schedule.eval(now=run_time2)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time2)
def test_eval_once(self):
'''
verify that scheduled job runs
'''
job_name = 'test_once'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'once': '2017-12-13T13:00:00',
}
@ -196,16 +213,17 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# Evaluate 1 second at the run time
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
def test_eval_once_loop_interval(self):
'''
verify that scheduled job runs
'''
job_name = 'test_eval_once_loop_interval'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'once': '2017-12-13T13:00:00',
}
@ -223,7 +241,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# Evaluate at the run time
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
@skipIf(not HAS_CRONITER, 'Cannot find croniter python module')
@ -231,11 +249,12 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
'''
verify that scheduled job runs
'''
job_name = 'test_eval_cron'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'cron': '0 16 29 11 *'
'cron': '0 16 29 11 *',
}
}
}
@ -248,7 +267,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
with patch('croniter.croniter.get_next', MagicMock(return_value=run_time)):
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
@skipIf(not HAS_CRONITER, 'Cannot find croniter python module')
@ -256,11 +275,12 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
'''
verify that scheduled job runs
'''
job_name = 'test_eval_cron_loop_interval'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'cron': '0 16 29 11 *'
'cron': '0 16 29 11 *',
}
}
}
@ -275,7 +295,7 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
with patch('croniter.croniter.get_next', MagicMock(return_value=run_time)):
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
def test_eval_until(self):
@ -283,40 +303,48 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
verify that scheduled job is skipped once the current
time reaches the specified until time
'''
job_name = 'test_eval_until'
job = {
'schedule': {
'job_eval_after': {
job_name: {
'function': 'test.ping',
'hours': '1',
'until': '11/29/2017 5:00pm'
'until': '11/29/2017 5:00pm',
}
}
}
if salt.utils.platform.is_darwin():
job['schedule'][job_name]['dry_run'] = True
# Add job to schedule
self.schedule.opts.update(job)
# eval at 2:00pm to prime, simulate minion start up.
run_time = dateutil_parser.parse('11/29/2017 2:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job_eval_after')
ret = self.schedule.job_status(job_name)
# eval at 3:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 3:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job_eval_after')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
time.sleep(2)
# eval at 4:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 4:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job_eval_after')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
time.sleep(2)
# eval at 5:00pm, will not run
run_time = dateutil_parser.parse('11/29/2017 5:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job_eval_after')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_skip_reason'], 'until_passed')
self.assertEqual(ret['_skipped_time'], run_time)
@ -325,12 +353,13 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
verify that scheduled job is skipped until after the specified
time has been reached.
'''
job_name = 'test_eval_after'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'hours': '1',
'after': '11/29/2017 5:00pm'
'after': '11/29/2017 5:00pm',
}
}
}
@ -341,33 +370,33 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 2:00pm to prime, simulate minion start up.
run_time = dateutil_parser.parse('11/29/2017 2:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
# eval at 3:00pm, will not run.
run_time = dateutil_parser.parse('11/29/2017 3:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_skip_reason'], 'after_not_passed')
self.assertEqual(ret['_skipped_time'], run_time)
# eval at 4:00pm, will not run.
run_time = dateutil_parser.parse('11/29/2017 4:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_skip_reason'], 'after_not_passed')
self.assertEqual(ret['_skipped_time'], run_time)
# eval at 5:00pm, will not run
run_time = dateutil_parser.parse('11/29/2017 5:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_skip_reason'], 'after_not_passed')
self.assertEqual(ret['_skipped_time'], run_time)
# eval at 6:00pm, will run
run_time = dateutil_parser.parse('11/29/2017 6:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
def test_eval_run_on_start(self):
@ -393,6 +422,8 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
ret = self.schedule.job_status('job1')
self.assertEqual(ret['_last_run'], run_time)
time.sleep(2)
# eval at 3:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 3:00pm')
self.schedule.eval(now=run_time)
@ -405,10 +436,11 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
when the enabled key is in place
https://github.com/saltstack/salt/issues/47695
'''
job_name = 'test_eval_enabled'
job = {
'schedule': {
'enabled': True,
'job1': {
job_name: {
'function': 'test.ping',
'when': '11/29/2017 4:00pm',
}
@ -422,12 +454,12 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
# Evaluate 1 second before the run time
self.schedule.eval(now=run_time1)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertNotIn('_last_run', ret)
# Evaluate 1 second at the run time
self.schedule.eval(now=run_time2)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time2)
def test_eval_seconds(self):
@ -472,6 +504,8 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
self.assertEqual(ret['_last_run'], run_time)
self.assertEqual(ret['_next_fire_time'], next_run_time)
time.sleep(2)
# eval at 2:01:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 2:01:00pm')
next_run_time = run_time + datetime.timedelta(seconds=30)
@ -480,6 +514,8 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
self.assertEqual(ret['_last_run'], run_time)
self.assertEqual(ret['_next_fire_time'], next_run_time)
time.sleep(2)
# eval at 2:01:30pm, will run.
run_time = dateutil_parser.parse('11/29/2017 2:01:30pm')
next_run_time = run_time + datetime.timedelta(seconds=30)
@ -528,12 +564,16 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
time.sleep(2)
# eval at 3:00:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 3:00:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
time.sleep(2)
# eval at 3:30:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 3:30:00pm')
self.schedule.eval(now=run_time)
@ -580,12 +620,16 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
time.sleep(2)
# eval at 6:00:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 6:00:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
time.sleep(2)
# eval at 8:00:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 8:00:00pm')
self.schedule.eval(now=run_time)
@ -636,6 +680,8 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
self.assertEqual(ret['_last_run'], last_run_time)
self.assertEqual(ret['_next_fire_time'], next_run_time)
time.sleep(2)
# eval at 11/27/2017 2:00:00pm, will run.
run_time = dateutil_parser.parse('11/27/2017 2:00:00pm')
next_run_time = run_time + datetime.timedelta(days=2)
@ -644,6 +690,8 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
self.assertEqual(ret['_last_run'], run_time)
self.assertEqual(ret['_next_fire_time'], next_run_time)
time.sleep(2)
# eval at 11/28/2017 2:00:00pm, will not run.
run_time = dateutil_parser.parse('11/28/2017 2:00:00pm')
last_run_time = run_time - datetime.timedelta(days=1)
@ -652,6 +700,8 @@ class SchedulerEvalTest(ModuleCase, SaltReturnAssertsMixin):
self.assertEqual(ret['_last_run'], last_run_time)
self.assertEqual(ret['_next_fire_time'], next_run_time)
time.sleep(2)
# eval at 11/29/2017 2:00:00pm, will run.
run_time = dateutil_parser.parse('11/29/2017 2:00:00pm')
next_run_time = run_time + datetime.timedelta(days=2)

View file

@ -50,9 +50,10 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
'''
verify that scheduled job is skipped at the specified time
'''
job_name = 'test_skip'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'when': ['11/29/2017 4pm', '11/29/2017 5pm'],
}
@ -63,12 +64,12 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
self.schedule.opts.update(job)
run_time = dateutil_parser.parse('11/29/2017 4:00pm')
self.schedule.skip_job('job1', {'time': run_time.strftime('%Y-%m-%dT%H:%M:%S'),
'time_fmt': '%Y-%m-%dT%H:%M:%S'})
self.schedule.skip_job(job_name, {'time': run_time.strftime('%Y-%m-%dT%H:%M:%S'),
'time_fmt': '%Y-%m-%dT%H:%M:%S'})
# Run 11/29/2017 at 4pm
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertNotIn('_last_run', ret)
self.assertEqual(ret['_skip_reason'], 'skip_explicit')
self.assertEqual(ret['_skipped_time'], run_time)
@ -76,16 +77,17 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# Run 11/29/2017 at 5pm
run_time = dateutil_parser.parse('11/29/2017 5:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
def test_skip_during_range(self):
'''
verify that scheduled job is skipped during the specified range
'''
job_name = 'test_skip_during_range'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'hours': '1',
'skip_during_range': {
@ -102,12 +104,12 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 1:30pm to prime.
run_time = dateutil_parser.parse('11/29/2017 1:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
# eval at 2:30pm, will not run during range.
run_time = dateutil_parser.parse('11/29/2017 2:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertNotIn('_last_run', ret)
self.assertEqual(ret['_skip_reason'], 'in_skip_range')
self.assertEqual(ret['_skipped_time'], run_time)
@ -115,20 +117,21 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 3:30pm, will run.
run_time = dateutil_parser.parse('11/29/2017 3:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
def test_skip_during_range_global(self):
'''
verify that scheduled job is skipped during the specified range
'''
job_name = 'skip_during_range_global'
job = {
'schedule': {
'skip_during_range': {
'start': '11/29/2017 2pm',
'end': '11/29/2017 3pm'
},
'job1': {
job_name: {
'function': 'test.ping',
'hours': '1',
}
@ -141,12 +144,12 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 1:30pm to prime.
run_time = dateutil_parser.parse('11/29/2017 1:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
# eval at 2:30pm, will not run during range.
run_time = dateutil_parser.parse('11/29/2017 2:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertNotIn('_last_run', ret)
self.assertEqual(ret['_skip_reason'], 'in_skip_range')
self.assertEqual(ret['_skipped_time'], run_time)
@ -154,16 +157,17 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 3:30pm, will run.
run_time = dateutil_parser.parse('11/29/2017 3:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
def test_run_after_skip_range(self):
'''
verify that scheduled job is skipped during the specified range
'''
job_name = 'skip_run_after_skip_range'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'when': '11/29/2017 2:30pm',
'run_after_skip_range': True,
@ -181,7 +185,7 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 2:30pm, will not run during range.
run_time = dateutil_parser.parse('11/29/2017 2:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertNotIn('_last_run', ret)
self.assertEqual(ret['_skip_reason'], 'in_skip_range')
self.assertEqual(ret['_skipped_time'], run_time)
@ -189,16 +193,17 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 3:00:01pm, will run.
run_time = dateutil_parser.parse('11/29/2017 3:00:01pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertEqual(ret['_last_run'], run_time)
def test_run_seconds_skip(self):
'''
verify that scheduled job is skipped during the specified range
'''
job_name = 'run_seconds_skip'
job = {
'schedule': {
'job1': {
job_name: {
'function': 'test.ping',
'seconds': '10',
}
@ -211,19 +216,19 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# eval at 2:00pm, to prime the scheduler
run_time = dateutil_parser.parse('11/29/2017 2:00pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
# eval at 2:00:10pm
run_time = dateutil_parser.parse('11/29/2017 2:00:10pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
# Skip at 2:00:20pm
run_time = dateutil_parser.parse('11/29/2017 2:00:20pm')
self.schedule.skip_job('job1', {'time': run_time.strftime('%Y-%m-%dT%H:%M:%S'),
'time_fmt': '%Y-%m-%dT%H:%M:%S'})
self.schedule.skip_job(job_name, {'time': run_time.strftime('%Y-%m-%dT%H:%M:%S'),
'time_fmt': '%Y-%m-%dT%H:%M:%S'})
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertIn('_next_fire_time', ret)
self.assertEqual(ret['_skip_reason'], 'skip_explicit')
self.assertEqual(ret['_skipped_time'], run_time)
@ -231,5 +236,5 @@ class SchedulerSkipTest(ModuleCase, SaltReturnAssertsMixin):
# Run at 2:00:30pm
run_time = dateutil_parser.parse('11/29/2017 2:00:30pm')
self.schedule.eval(now=run_time)
ret = self.schedule.job_status('job1')
ret = self.schedule.job_status(job_name)
self.assertIn('_last_run', ret)