diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f8ce9fdaf..409479073 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -37,6 +37,7 @@ Changed Qiskit Terra package. - The exception hierarchy has been revised: the package base exception is ``IBMQError``, and they have been grouped in ``.exception`` modules. (#5) +- Ensured that retrieved jobs come from their appropriate backend (#23) diff --git a/qiskit/providers/ibmq/ibmqbackend.py b/qiskit/providers/ibmq/ibmqbackend.py index 7420e94b1..6dd38f2e4 100644 --- a/qiskit/providers/ibmq/ibmqbackend.py +++ b/qiskit/providers/ibmq/ibmqbackend.py @@ -193,7 +193,15 @@ def retrieve_job(self, job_id): IBMQBackendError: if retrieval failed """ try: - job_info = self._api.get_status_job(job_id) + job_info = self._api.get_job(job_id) + if job_info['backend']['name'] != self.name(): + warnings.warn('Job "{}" belongs to another backend than the one queried. ' + 'The query was made on backend "{}", ' + 'but the job actually belongs to backend "{}".' + .format(job_id, job_info['backend']['name'], self.name())) + raise IBMQBackendError('Failed to get job "{}": ' + 'job does not belong to backend "{}".' + .format(job_id, job_info['backend']['name'])) if 'error' in job_info: raise IBMQBackendError('Failed to get job "{}": {}' .format(job_id, job_info['error'])) diff --git a/test/ibmq/test_ibmq_job.py b/test/ibmq/test_ibmq_job.py index 0efcd616f..1cbcfffe8 100644 --- a/test/ibmq/test_ibmq_job.py +++ b/test/ibmq/test_ibmq_job.py @@ -269,6 +269,31 @@ def test_retrieve_job(self, qe_token, qe_url): else: self.assertEqual(job.qobj(), None) + @slow_test + @requires_qe_access + def test_retrieve_job_uses_appropriate_backend(self, qe_token, qe_url): + """Test that retrieved jobs come from their appropriate backend.""" + IBMQ.enable_account(qe_token, qe_url) + simulator_backend = IBMQ.get_backend('ibmq_qasm_simulator') + backends = IBMQ.backends(simulator=False) + real_backend = least_busy(backends) + + qobj_sim = compile(self._qc, simulator_backend) + job_sim = simulator_backend.run(qobj_sim) + + qobj_real = compile(self._qc, real_backend) + job_real = real_backend.run(qobj_real) + + # test a retrieved job's backend is the same as the queried backend + self.assertEqual(simulator_backend.retrieve_job(job_sim.job_id()).backend().name(), + simulator_backend.name()) + self.assertEqual(real_backend.retrieve_job(job_real.job_id()).backend().name(), + real_backend.name()) + + # test retrieve requests for jobs that exist on other backends throw errors + self.assertRaises(IBMQBackendError, simulator_backend.retrieve_job, job_real.job_id()) + self.assertRaises(IBMQBackendError, real_backend.retrieve_job, job_sim.job_id()) + @requires_qe_access def test_retrieve_job_error(self, qe_token, qe_url): """Test retrieving an invalid job."""