def test_job_create_no_worker_assigned(self): fixture = { 'action': 'snapshot', 'tenant_id': unit_utils.TENANT1, 'schedule_id': unit_utils.SCHEDULE_UUID2, 'status': 'queued', 'job_metadata': [ { 'key': 'instance_id', 'value': 'my_instance', }, ], } timeutils.set_time_override() now = timeutils.utcnow() job = self.db_api.job_create(fixture) timeutils.clear_time_override() self.assertTrue(uuidutils.is_uuid_like(job['id'])) self.assertNotEqual(job['created_at'], None) self.assertNotEqual(job['updated_at'], None) self.assertEqual(job['timeout'], now + timedelta(seconds=30)) self.assertEqual(job['hard_timeout'], now + timedelta(seconds=30)) self.assertEqual(job['schedule_id'], fixture['schedule_id']) self.assertEqual(job['worker_id'], None) self.assertEqual(job['status'], fixture['status']) self.assertEqual(job['retry_count'], 0) metadata = job['job_metadata'] self.assertEqual(len(metadata), 1) self.assertEqual(metadata[0]['key'], fixture['job_metadata'][0]['key']) self.assertEqual(metadata[0]['value'], fixture['job_metadata'][0]['value'])
def test_schedule_update_remove_metadata(self): fixture = { 'id': str(uuid.uuid4()), 'tenant': str(uuid.uuid4()), 'action': 'snapshot', 'minute': 30, 'hour': 2, 'schedule_metadata': [ { 'key': 'instance_id', 'value': 'my_instance', }, ], } schedule = self.db_api.schedule_create(fixture) fixture = { 'schedule_metadata': [], } timeutils.set_time_override() timeutils.advance_time_seconds(2) updated_schedule = self.db_api.schedule_update(schedule['id'], fixture) timeutils.clear_time_override() self.assertTrue(uuidutils.is_uuid_like(schedule['id'])) self.assertEqual(updated_schedule['tenant'], schedule['tenant']) self.assertEqual(updated_schedule['action'], schedule['action']) self.assertEqual(updated_schedule['minute'], schedule['minute']) self.assertEqual(updated_schedule['hour'], schedule['hour']) metadata = updated_schedule['schedule_metadata'] self.assertEqual(len(metadata), 0) # updated child metadata collection doesn't update the parent schedule self.assertEqual(updated_schedule['updated_at'], schedule['updated_at'])
def test_jobs_cleanup_hard_timed_out(self): workers = self.db_api.job_get_all() self.assertEqual(len(workers), 2) timeutils.set_time_override() timeutils.advance_time_seconds(61) self.db_api._jobs_cleanup_hard_timed_out() timeutils.clear_time_override() workers = self.db_api.job_get_all() self.assertEqual(len(workers), 0)
def test_jobs_cleanup_hard_timed_out(self): jobs = self.db_api.job_get_all() self.assertEqual(len(jobs), 2) timeutils.set_time_override() timeutils.advance_time_delta(datetime.timedelta(hours=4, minutes=1)) self.db_api._jobs_cleanup_hard_timed_out() timeutils.clear_time_override() jobs = self.db_api.job_get_all() self.assertEqual(len(jobs), 0)
def test_get_schedules(self): timeutils.set_time_override() start_time = timeutils.isotime() timeutils.advance_time_seconds(30) end_time = timeutils.isotime() filter_args = {"next_run_after": start_time, "next_run_before": end_time} self.client.list_schedules(filter_args=filter_args).AndReturn([]) self.mox.ReplayAll() self.scheduler.get_schedules(start_time, end_time) self.mox.VerifyAll()
def test_get_schedules(self): timeutils.set_time_override() previous_run = timeutils.isotime() timeutils.advance_time_seconds(30) current_run = timeutils.isotime() filter_args = {'next_run_after': previous_run, 'next_run_before': current_run} self.client.list_schedules(filter_args=filter_args).AndReturn([]) self.mox.ReplayAll() self.scheduler.get_schedules(previous_run, current_run) self.mox.VerifyAll()
def test_get_next_job_unassigned(self): timeutils.set_time_override() self._create_jobs(10, self.job_fixture_1, self.job_fixture_2) job = db_api.job_get_and_assign_next_by_action('snapshot', unit_utils.WORKER_UUID1) expected = self.jobs[0] self.assertEqual(job['id'], expected['id']) self.assertEqual(job['worker_id'], unit_utils.WORKER_UUID1) timeout = expected['created_at'] + timedelta(seconds=30) hard_timeout = expected['created_at'] + timedelta(seconds=30) self.assertEqual(job['timeout'], timeout) self.assertEqual(job['hard_timeout'], hard_timeout) self.assertEqual(job['retry_count'], expected['retry_count'] + 1)
def test_run_loop(self): self.config(job_schedule_interval=5, group="scheduler") timeutils.set_time_override() current_time = timeutils.isotime() called = {"enqueue_jobs": False} def fake(end_time=None): # assert only end_time kwarg is passed self.assertEqual(end_time, current_time) called["enqueue_jobs"] = True self.stubs.Set(self.scheduler, "enqueue_jobs", fake) fake_sleep = lambda x: None self.stubs.Set(time, "sleep", fake_sleep) self.scheduler.run(run_once=True) self.assertTrue(called["enqueue_jobs"])
def test_schedule_update(self): fixture = { 'id': str(uuid.uuid4()), 'tenant_id': str(uuid.uuid4()), 'action': 'snapshot', 'minute': 30, 'hour': 2, } schedule = self.db_api.schedule_create(fixture) fixture = {'hour': 3} timeutils.set_time_override() timeutils.advance_time_seconds(2) updated_schedule = self.db_api.schedule_update(schedule['id'], fixture) timeutils.clear_time_override() self.assertTrue(uuidutils.is_uuid_like(schedule['id'])) self.assertEqual(updated_schedule['tenant_id'], schedule['tenant_id']) self.assertEqual(updated_schedule['action'], schedule['action']) self.assertEqual(updated_schedule['minute'], schedule['minute']) self.assertEqual(updated_schedule['hour'], fixture['hour']) self.assertEqual(updated_schedule['created_at'], schedule['created_at']) self.assertNotEqual(updated_schedule['updated_at'], schedule['updated_at'])
def test_job_workflow(self): # (setup) create schedule meta1 = {'key': 'key1', 'value': 'value1'} meta2 = {'key': 'key2', 'value': 'value2'} request = { 'schedule': { 'tenant_id': TENANT1, 'action': 'snapshot', 'minute': '30', 'hour': '12', 'schedule_metadata': [ meta1, meta2, ] } } schedule = self.client.create_schedule(request) # create job new_job = self.client.create_job(schedule['id']) self.assertIsNotNone(new_job.get('id')) self.assertEqual(new_job['schedule_id'], schedule['id']) self.assertEqual(new_job['tenant_id'], schedule['tenant_id']) self.assertEqual(new_job['action'], schedule['action']) self.assertEqual(new_job['status'], 'queued') self.assertMetadataInList(new_job['job_metadata'], meta1) self.assertMetadataInList(new_job['job_metadata'], meta2) # list jobs jobs = self.client.list_jobs() self.assertEqual(len(jobs), 1) self.assertEqual(jobs[0]['id'], new_job['id']) self.assertEqual(jobs[0]['schedule_id'], new_job['schedule_id']) self.assertEqual(jobs[0]['status'], new_job['status']) self.assertEqual(jobs[0]['retry_count'], new_job['retry_count']) # get job job = self.client.get_job(new_job['id']) self.assertEqual(job['id'], new_job['id']) self.assertEqual(job['schedule_id'], new_job['schedule_id']) self.assertEqual(job['status'], new_job['status']) self.assertEqual(job['retry_count'], new_job['retry_count']) # list job metadata metadata = self.client.list_job_metadata(new_job['id']) self.assertMetadataInList(metadata, meta1) self.assertMetadataInList(metadata, meta2) # get job metadata meta_value = self.client.get_job_metadata(new_job['id'], meta1['key']) self.assertEqual(meta_value, meta1['value']) # get heartbeat heartbeat = self.client.get_job_heartbeat(job['id'])['heartbeat'] self.assertIsNotNone(heartbeat) # heartbeat timeutils.set_time_override() timeutils.advance_time_seconds(30) self.client.job_heartbeat(job['id']) new_heartbeat = self.client.get_job_heartbeat(job['id'])['heartbeat'] self.assertNotEqual(new_heartbeat, heartbeat) timeutils.clear_time_override() # get status status = self.client.get_job_status(job['id'])['status'] self.assertEqual(status, new_job['status']) # update status self.client.update_job_status(job['id'], 'done') status = self.client.get_job_status(job['id'])['status'] self.assertNotEqual(status, new_job['status']) self.assertEqual(status, 'done') # delete job self.client.delete_job(job['id']) # make sure job no longer exists self.assertRaises(client_exc.NotFound, self.client.get_job, job['id'])
def setUp(self): super(TestJobsDBGetNextJobApi, self).setUp() self.db_api = db_api timeutils.set_time_override() self._create_job_fixtures()
def setUp(self): super(TestSchedulesDBApi, self).setUp() self.db_api = db_api timeutils.set_time_override(datetime.datetime( year=2013, month=1, day=1, hour=9, minute=0)) self._create_schedules()