def _create_jobs(self, gap, *fixtures): now = timeutils.utcnow() self.jobs = [] for fixture in fixtures: self.jobs.append(self.db_api.job_create(fixture)) timeutils.advance_time_seconds(gap) return now
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_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_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'])