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_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_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_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 tearDown(self): super(TestJobsDBGetNextJobApi, self).tearDown() timeutils.clear_time_override() self.db_api.reset()
def tearDown(self): super(TestSchedulesDBApi, self).setUp() self.db_api.reset() timeutils.clear_time_override()