def test_parent_children__fail(self): parent_state = create_state_from_ee2(BATCH_PARENT) child_states = [create_state_from_ee2(job_id) for job_id in BATCH_CHILDREN] with self.assertRaisesRegex( ValueError, "Must supply children when setting children of batch job parent" ): Job(parent_state) child_jobs = [Job(child_state) for child_state in child_states] with self.assertRaisesRegex(ValueError, CHILD_ID_MISMATCH): Job( parent_state, children=child_jobs[1:], ) with self.assertRaisesRegex(ValueError, CHILD_ID_MISMATCH): Job( parent_state, children=child_jobs * 2, ) with self.assertRaisesRegex(ValueError, CHILD_ID_MISMATCH): Job( parent_state, children=child_jobs + [create_job_from_ee2(JOB_COMPLETED)], )
def test_parameters__param_fetch_fail(self): """ test failure to retrieve job params data """ job_state = get_test_job(JOB_TERMINATED) del job_state["job_input"]["params"] job = Job(job_state) self.assertEqual(job.params, JOB_ATTR_DEFAULTS["params"]) with self.assertRaisesRegex(Exception, "Unable to fetch parameters for job"): job.parameters()
def test_query_job_state(self): for job_id in ALL_JOBS: exp = create_state_from_ee2( job_id, exclude_fields=JOB_INIT_EXCLUDED_JOB_STATE_FIELDS ) got = Job.query_ee2_state(job_id, init=True) self.assertEqual(exp, got) exp = create_state_from_ee2( job_id, exclude_fields=EXCLUDED_JOB_STATE_FIELDS ) got = Job.query_ee2_state(job_id, init=False) self.assertEqual(exp, got)
def test_parameters(self): """ test that a job returns the correct parameters """ job_state = get_test_job(JOB_COMPLETED) job_params = job_state.get("job_input", {}).get("params", None) self.assertIsNotNone(job_params) job = Job(job_state) self.assertIsNotNone(job.params) with assert_obj_method_called(MockClients, "get_job_params", call_status=False): params = job.parameters() self.assertIsNotNone(params) self.assertEqual(params, job_params)
def test_query_job_states(self): states = Job.query_ee2_states(ALL_JOBS, init=True) for job_id, got in states.items(): exp = create_state_from_ee2( job_id, exclude_fields=JOB_INIT_EXCLUDED_JOB_STATE_FIELDS ) self.assertEqual(exp, got) states = Job.query_ee2_states(ALL_JOBS, init=False) for job_id, got in states.items(): exp = create_state_from_ee2( job_id, exclude_fields=EXCLUDED_JOB_STATE_FIELDS ) self.assertEqual(exp, got)
def test_parameters__param_fetch_ok(self): """ test that a job can successfully retrieve parameters from ee2 if they do not exist """ job_state = get_test_job(JOB_CREATED) job_params = job_state.get("job_input", {}).get("params", None) self.assertIsNotNone(job_params) # delete the job params from the input del job_state["job_input"]["params"] job = Job(job_state) self.assertEqual(job.params, JOB_ATTR_DEFAULTS["params"]) params = job.parameters() self.assertEqual(params, job_params)
def phony_job(): return Job.from_state('phony_job', { 'params': [], 'service_ver': '0.0.0' }, 'kbasetest', 'NarrativeTest/test_editor', tag='dev')
def test_job_init__from_job_ids(self): job_ids = ALL_JOBS.copy() job_ids.remove(BATCH_PARENT) with mock.patch(CLIENTS, get_mock_client): jobs = Job.from_job_ids(job_ids, return_list=False) for job_id, job in jobs.items(): self.check_job_attrs(job, job_id)
def get_batch_family_jobs(return_list=False): """ As invoked in appmanager's run_app_batch, i.e., with from_job_id(s) """ child_jobs = Job.from_job_ids(BATCH_CHILDREN, return_list=True) batch_job = Job.from_job_id(BATCH_PARENT, children=child_jobs) if return_list: return [batch_job] + child_jobs else: return { BATCH_PARENT: batch_job, **{ child_id: child_job for child_id, child_job in zip(BATCH_CHILDREN, child_jobs) }, }
def test_parent_children__ok(self): child_jobs = [Job.from_job_id(job_id) for job_id in BATCH_CHILDREN] parent_job = Job( create_state_from_ee2(BATCH_PARENT), children=child_jobs, ) self.assertFalse(parent_job.was_terminal()) # Make all child jobs completed with mock.patch.object( MockClients, "check_job", mock.Mock(return_value={"status": COMPLETED_STATUS}), ): for child_job in child_jobs: child_job.state(force_refresh=True) self.assertTrue(parent_job.was_terminal())
def test_job_init__from_job_id(self): """ test job initialisation, as is done by run_app """ for job_id in ALL_JOBS: if job_id == BATCH_PARENT: continue with mock.patch(CLIENTS, get_mock_client): job = Job.from_job_id(job_id) self.check_job_attrs(job, job_id)
def phony_job(): return Job.from_state( "phony_job", { "params": [], "service_ver": "0.0.0" }, "kbasetest", "NarrativeTest/test_editor", tag="dev", )
def _mocked_job(self, with_version=True, with_cell_id=True, with_run_id=True, with_token_id=True): kwargs = dict() if with_version: kwargs["app_version"] = self.app_version if with_cell_id: kwargs["cell_id"] = self.cell_id if with_run_id: kwargs["run_id"] = self.run_id if with_token_id: kwargs["token_id"] = self.token_id job = Job(self.job_id, self.app_id, self.inputs, self.owner, tag=self.app_tag, **kwargs) return job
def test_job_from_state(self): job_info = { "params": self.inputs, "service_ver": self.app_version } job = Job.from_state(self.job_id, job_info, self.owner, self.app_id, tag=self.app_tag, cell_id=self.cell_id, run_id=self.run_id, token_id=self.token_id) self.assertEqual(job.job_id, self.job_id) self.assertEqual(job.app_id, self.app_id) self.assertEqual(job.inputs, self.inputs) self.assertEqual(job.owner, self.owner) self.assertEqual(job.tag, self.app_tag) self.assertEqual(job.app_version, self.app_version) self.assertEqual(job.cell_id, self.cell_id) self.assertEqual(job.run_id, self.run_id) self.assertEqual(job.token_id, self.token_id)
def test_job_init__extra_state(self): """ test job initialisation as is done by run_legacy_batch_app """ app_id = "kb_BatchApp/run_batch" extra_data = { "batch_app": app_id, "batch_tag": None, "batch_size": 300, } for job_id in ALL_JOBS: if job_id == BATCH_PARENT: continue with mock.patch(CLIENTS, get_mock_client): batch_job = Job.from_job_id( job_id, extra_data=extra_data, ) self.check_job_attrs(batch_job, job_id, {"extra_data": extra_data})
def test_job_from_state__custom(self): """ test job initialisation with defaults being filled in TODO do a non-default? """ params = [ { "import_type": "FASTQ/FASTA", "name": "small.forward.fq", } ] test_job = { "user": "******", "job_input": { "params": params, "service_ver": "42", "app_id": "This/app", }, "job_id": "0123456789abcdef", } expected = { "app_id": "This/app", "app_version": "42", "batch_id": JOB_ATTR_DEFAULTS["batch_id"], "cell_id": JOB_ATTR_DEFAULTS["cell_id"], "extra_data": None, "job_id": "0123456789abcdef", "params": params, "run_id": JOB_ATTR_DEFAULTS["run_id"], "tag": JOB_ATTR_DEFAULTS["tag"], "user": "******", } job = Job(test_job) self.check_job_attrs_custom(job, expected)
def test_show_output_widget(self, mock_method): mock_method.return_value = True job = Job(get_test_job(JOB_COMPLETED)) self.assertTrue(job.show_output_widget()) mock_method.assert_called_once()
def test_job_init__error_no_job_id(self): with self.assertRaisesRegex( ValueError, "Cannot create a job without a job ID!" ): Job({"params": {}, "app_id": "this/that"})
def test_show_output_widget__incomplete_state(self): job = Job(get_test_job(JOB_CREATED)) self.assertRegex( job.show_output_widget(), "Job is incomplete! It has status 'created'" )
def create_job_from_ee2(job_id, extra_data=None, children=None): state = get_test_job(job_id) job = Job(state, extra_data=extra_data, children=children) return job
def phony_job(): return Job.from_state('phony_job', {'params': [], 'service_ver': '0.0.0'}, 'kbasetest', 'NarrativeTest/test_editor', tag='dev')