def create_schedules(events): schedules = [] for job in api.get_jobs(): cmd_sch = croniter(job.interval, job.last_time_run) # If we have missed more than one occurrence only run one time = cmd_sch.get_next(datetime) next_time = cmd_sch.get_next(datetime) if next_time <= datetime.now(): time = next_time next_time = cmd_sch.get_next(datetime) if (time - datetime.now()) < SCHEDULER_UPDATE_INTERVAL: job.last_time_run = time api.set_job_time(job) next_worker = api.get_next_worker() if next_worker is None: break schedule = api.Schedule(time, job, next_worker) schedules.append(schedule) api.add_schedules(sort_schedules(schedules)) delay = SCHEDULER_UPDATE_INTERVAL.total_seconds() events.enter(delay, 1, create_schedules, (events,))
def create_schedules(events): schedules = [] for job in api.get_jobs(): cmd_sch = croniter(job.interval, job.last_time_run) # If we have missed more than one occurrence only run one time = cmd_sch.get_next(datetime) next_time = cmd_sch.get_next(datetime) if next_time <= datetime.now(): time = next_time next_time = cmd_sch.get_next(datetime) if (time - datetime.now()) < SCHEDULER_UPDATE_INTERVAL: job.last_time_run = time api.set_job_time(job) next_worker = api.get_next_worker() if next_worker is None: break schedule = api.Schedule(time, job, next_worker) schedules.append(schedule) api.add_schedules(sort_schedules(schedules)) delay = SCHEDULER_UPDATE_INTERVAL.total_seconds() events.enter(delay, 1, create_schedules, (events, ))
def test_update_heartbeat_deleted_worker(self): test_workers = [] # Create a temporary worker in the test workers to_be_deleted = test_workers.append(api.create_worker()) # Destroy the only worker in the list api.destroy_worker(api.get_next_worker()) # Verify that we do not update nonexistent workers with self.assertRaises(ValueError): api.update_heartbeat(to_be_deleted)
def check_worker_heartbeat(events): for w in api.get_workers(): if (datetime.now() - w.heartbeat) > WORKER_HEARTBEAT_TIMEOUT: for schedule in api.get_schedules(w): schedule.worker = api.get_next_worker() api.destroy_worker(w) delay = WORKER_HEARTBEAT_TIMEOUT.total_seconds() events.enter(delay, 1, check_worker_heartbeat, (events,))
def check_worker_heartbeat(events): for w in api.get_workers(): if (datetime.now() - w.heartbeat) > WORKER_HEARTBEAT_TIMEOUT: for schedule in api.get_schedules(w): schedule.worker = api.get_next_worker() api.destroy_worker(w) delay = WORKER_HEARTBEAT_TIMEOUT.total_seconds() events.enter(delay, 1, check_worker_heartbeat, (events, ))
def test_destroy_worker_one_worker(self): test_workers = [] # Create one worker and add it to a list for bookkeeping test_workers.append(api.create_worker()) # Kill the only worker in the list api.destroy_worker(test_workers[0]) # Try to get a worker from an empty pool next_worker = api.get_next_worker() # Verify that the next worker does not exist self.assertEqual(next_worker, None)
def test_get_next_worker_one_worker(self): num_of_workers = ONE test_workers = [] # Create one worker and add it to a list for bookkeeping test_workers.append(api.create_worker()) workers_list = [] workers_list.append(api.get_next_worker()) # Verify that the workers list contains exactly one worker self.assertEqual(len(workers_list), num_of_workers) # Verify that the information we get is the same as what was set check_worker_fields(self, workers_list, test_workers)
def test_get_next_worker_one_worker_many_requests(self): num_of_workers = ONE num_of_requests = MANY test_workers = [] # Create one worker and it to a list for bookkeeping test_workers.append(api.create_worker()) # Verify that the test workers contains exactly one worker self.assertEqual(len(test_workers), num_of_workers) workers_list = [] for request in range(num_of_requests): # Get workers and add them to a list for # comparison with list of test workers workers_list.append(api.get_next_worker()) # Verify that the workers list contains # as many workers as there were requests self.assertEqual(len(workers_list), num_of_requests) # Verify that the information we get is the same as what was set check_worker_fields(self, workers_list, test_workers)
def test_get_next_worker_many_workers_more_requests(self): num_of_workers = MANY num_of_requests = MORE_THAN_MANY test_workers = [] for worker in range(num_of_workers): # Create many workers and add them to a list for bookkeeping test_workers.append(api.create_worker()) # Verify that the test workers contains # the correct number of workers self.assertEqual(len(test_workers), num_of_workers) workers_list = [] for request in range(num_of_requests): # Get more workers than available in the test workers # (popped workers are pushed to the end of the queue) # and add them to a list for comparison workers_list.append(api.get_next_worker()) # Verify that the workers list contains # as many workers as there were requests self.assertEqual(len(workers_list), num_of_requests) # Verify that the information we get is the same as what was set check_worker_fields(self, workers_list, test_workers)
def test_destroy_worker_many_workers(self): # Number of workers and floor(requests) + ceiling(requests) are equal num_of_workers = MANY # Automatic flooring care of Python num_of_requests = num_of_workers/2 test_workers = [] for worker in range(num_of_workers): # Create many workers and add them to a list for bookkeeping test_workers.append(api.create_worker()) # Kill the floor of half of the workers in the list for request in range(num_of_requests): api.destroy_worker(test_workers.pop()) workers_list = [] workers_list = api.get_workers() # Verify that the correct workers are still in the list check_worker_fields(self, workers_list, test_workers) # Remove the rest of the test workers while test_workers: api.destroy_worker(test_workers.pop()) # Try to get a worker from an empty pool next_worker = api.get_next_worker() # Verify that the next worker does not exist self.assertEqual(next_worker, None)
def test_destroy_worker_many_workers(self): # Number of workers and floor(requests) + ceiling(requests) are equal num_of_workers = MANY # Automatic flooring care of Python num_of_requests = num_of_workers / 2 test_workers = [] for worker in range(num_of_workers): # Create many workers and add them to a list for bookkeeping test_workers.append(api.create_worker()) # Kill the floor of half of the workers in the list for request in range(num_of_requests): api.destroy_worker(test_workers.pop()) workers_list = [] workers_list = api.get_workers() # Verify that the correct workers are still in the list check_worker_fields(self, workers_list, test_workers) # Remove the rest of the test workers while test_workers: api.destroy_worker(test_workers.pop()) # Try to get a worker from an empty pool next_worker = api.get_next_worker() # Verify that the next worker does not exist self.assertEqual(next_worker, None)
def test_get_next_worker_empty_workers(self): # Try to get the next worker from an empty pool next_worker = api.get_next_worker() # Verify that the next worker does not exist self.assertEqual(next_worker, None)