def test_job(self): fw = self.fw gear = fw.get_gear(self.gear_id) self.assertIsNotNone(gear) poem = 'Mere anarchy is loosed upon the world,' fw.upload_file_to_acquisition(self.acquisition_id, flywheel.FileSpec('yeats.txt', poem)) tag = self.rand_string() # Get the acquisition destination and file input acq = fw.get_acquisition(self.acquisition_id) any_file = acq.files[0] self.assertEqual(any_file.name, 'yeats.txt') # Add job_id = gear.run(destination=acq, tags=[tag], inputs={'any-file': any_file}) self.assertNotEmpty(job_id) # Get r_job = fw.get_job(job_id) self.assertEqual(r_job.gear_id, self.gear_id) gear_info = r_job.gear_info self.assertEqual(gear_info.category, gear.category) self.assertEqual(gear_info.name, gear.gear.name) self.assertEqual(gear_info.version, gear.gear.version) self.assertEqual(r_job.state, 'pending') self.assertEqual(r_job.attempt, 1) self.assertIsNotNone(r_job.origin) self.assertEqual(r_job.origin.type, 'user') self.assertNotEmpty(r_job.origin.id) self.assertIn(tag, r_job.tags) self.assertTimestampBeforeNow(r_job.created) self.assertGreaterEqual(r_job.modified, r_job.created) # Modify tag2 = self.rand_string() r_job.update(tags=[tag2]) # Check r_job = fw.get_job(job_id) self.assertEqual(r_job.state, 'pending') self.assertNotIn(tag, r_job.tags) self.assertIn(tag2, r_job.tags) # Get session jobs jobs = fw.get_session_jobs(self.session_id) self.assertIsNotNone(jobs) self.assertIsNotNone(jobs.jobs) self.assertEqual(1, len(jobs.jobs)) # job list doesn't info field r_job.config['inputs']['any-file']['object'].pop('info', None) self.assertIn(r_job, jobs.jobs) # Get all jobs jobs = fw.jobs(limit=100, sort='created:desc') self.assertIsNotNone(jobs) self.assertGreaterEqual(len(jobs), 1) self.assertTrue(any([job.id == job_id for job in jobs])) # Cancel job_mod = flywheel.Job(state='cancelled') fw.modify_job(job_id, job_mod) # Check r_job = fw.get_job(job_id) self.assertEqual(r_job.state, 'cancelled')
def test_job_queue(self): fw = self.fw poem = 'The blood-dimmed tide is loosed, and everywhere' fw.upload_file_to_acquisition(self.acquisition_id, flywheel.FileSpec('yeats.txt', poem)) tag = self.rand_string() job = flywheel.Job(gear_id=self.gear_id, destination=flywheel.JobDestination( id=self.acquisition_id, type='acquisition'), inputs={ 'any-file': flywheel.FileReference(id=self.acquisition_id, type='acquisition', name='yeats.txt') }, tags=[tag]) # Add job_id = fw.add_job(job) self.assertNotEmpty(job_id) # Check r_job = fw.get_job(job_id) self.assertEqual(r_job.state, 'pending') # Run r_job = fw.get_next_job(tags=[tag]) self.assertIsNotNone(r_job) self.assertEqual(r_job.id, job_id) self.assertIsNotNone(r_job.request) self.assertIn('dir', r_job.request.target) self.assertEqual(r_job.request.target['dir'], '/flywheel/v0') # Next fetch should not find any jobs try: fw.get_next_job(tags=[tag]) self.fail('Expected an error retrieving next job') except flywheel.ApiException as e: self.assertEqual(e.status, 400) # Heartbeat fw.modify_job(job_id, {}) r_job2 = fw.get_job(job_id) self.assertTimestampAfter(r_job2.modified, r_job.modified) # Add logs log1 = [flywheel.JobLogStatement(fd=-1, msg='System message')] log2 = [ flywheel.JobLogStatement(fd=1, msg='Standard out'), flywheel.JobLogStatement(fd=2, msg='Standard err') ] fw.add_job_logs(job_id, log1) fw.add_job_logs(job_id, log2) # Finish r_job.change_state('complete') r_job3 = fw.get_job(job_id) self.assertEqual(r_job3.state, 'complete') self.assertTimestampAfter(r_job3.modified, r_job2.modified) logs = fw.get_job_logs(job_id) self.assertEqual(len(logs.logs), 4) self.assertEqual(logs.logs[1], log1[0]) self.assertEqual(logs.logs[2], log2[0]) self.assertEqual(logs.logs[3], log2[1])
def test_batch_with_jobs(self): fw = self.fw_device gear = fw.get_gear(self.gear_id) self.assertIsNotNone(gear) # Make a couple jobs poem = 'Mere anarchy is loosed upon the world,' fw.upload_file_to_acquisition(self.acquisition_id, flywheel.FileSpec('yeats.txt', poem)) inputs = { 'any-file': flywheel.FileReference(id=self.acquisition_id, type='acquisition', name='yeats.txt') } destination = flywheel.JobDestination(id=self.acquisition_id, type='acquisition') tag = self.rand_string() jobs = [ flywheel.Job(gear_id=self.gear_id, destination=destination, inputs=inputs, tags=[tag]), flywheel.Job(gear_id=self.gear_id, destination=destination, inputs=inputs, tags=[tag]) ] # Propose batch jobs proposal = fw.create_batch_job_from_jobs( flywheel.BatchJobsProposalInput(jobs=jobs)) self.assertIsNotNone(proposal) self.assertNotEmpty(proposal.id) # Gear Id should be none, each job already knows its gear self.assertIsNone(proposal.gear_id) self.assertIsNotNone(proposal.origin) self.assertEqual(proposal.origin.type, 'device') self.assertNotEmpty(proposal.origin.id) self.assertTimestampBeforeNow(proposal.created) self.assertGreaterEqual(proposal.modified, proposal.created) # Get r_batch = fw.get_batch(proposal.id) self.assertIsNotNone(r_batch) # Gear Id should be none, each job already knows its gear self.assertIsNone(proposal.gear_id) self.assertEqual(r_batch.state, 'pending') # Get all batches = fw.get_all_batches() self.assertIn(r_batch, batches) # Start jobs = fw.start_batch(proposal.id) self.assertEqual(len(jobs), 2) # Get again r_batch2 = fw.get_batch(proposal.id) self.assertEqual(r_batch2.state, 'running') self.assertTimestampAfter(r_batch2.modified, r_batch.modified) # Cancel cancelled = fw.cancel_batch(proposal.id) self.assertEqual(cancelled, 2)