From 0453de956a94f03c0641c4a9f872088f3b517af6 Mon Sep 17 00:00:00 2001 From: Max Reuter Date: Mon, 21 Jan 2019 12:27:11 -0500 Subject: [PATCH 1/4] Test that retrieved jobs come from their appropriate backend --- qiskit/providers/ibmq/ibmqbackend.py | 5 ++++- test/ibmq/test_ibmq_job.py | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/qiskit/providers/ibmq/ibmqbackend.py b/qiskit/providers/ibmq/ibmqbackend.py index 7420e94b1..b063c86c0 100644 --- a/qiskit/providers/ibmq/ibmqbackend.py +++ b/qiskit/providers/ibmq/ibmqbackend.py @@ -193,7 +193,10 @@ 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(): + raise IBMQBackendError('Job "{}" belongs to backend "{}", not "{}".' + .format(job_id, job_info['backend']['name'], self.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.""" From cec553d2f52e57238e8134c2f745aaeded575483 Mon Sep 17 00:00:00 2001 From: Max Reuter Date: Mon, 21 Jan 2019 12:34:42 -0500 Subject: [PATCH 2/4] Update changelog --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) 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) From 16e85c79c52170b05e702dd58b2ea4f114b65997 Mon Sep 17 00:00:00 2001 From: Max Reuter Date: Wed, 23 Jan 2019 11:06:06 -0500 Subject: [PATCH 3/4] Change warning and error to be more appropriate --- qiskit/providers/ibmq/ibmqbackend.py | 11 +++++++++-- test/ibmq/test_ibmq_job.py | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/qiskit/providers/ibmq/ibmqbackend.py b/qiskit/providers/ibmq/ibmqbackend.py index b063c86c0..966d6a1d1 100644 --- a/qiskit/providers/ibmq/ibmqbackend.py +++ b/qiskit/providers/ibmq/ibmqbackend.py @@ -194,9 +194,16 @@ def retrieve_job(self, job_id): """ try: job_info = self._api.get_job(job_id) + print(job_info['backend']['name']) + print(self.name()) if job_info['backend']['name'] != self.name(): - raise IBMQBackendError('Job "{}" belongs to backend "{}", not "{}".' - .format(job_id, 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 1cbcfffe8..eccc3cb74 100644 --- a/test/ibmq/test_ibmq_job.py +++ b/test/ibmq/test_ibmq_job.py @@ -269,7 +269,7 @@ def test_retrieve_job(self, qe_token, qe_url): else: self.assertEqual(job.qobj(), None) - @slow_test + #@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.""" @@ -287,6 +287,7 @@ def test_retrieve_job_uses_appropriate_backend(self, qe_token, qe_url): # 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()) + print(job_real.backend().name(), real_backend.name()) self.assertEqual(real_backend.retrieve_job(job_real.job_id()).backend().name(), real_backend.name()) From 53deaed28c777505469b844904cd7dd1cffbf6dc Mon Sep 17 00:00:00 2001 From: Max Reuter Date: Wed, 23 Jan 2019 11:07:25 -0500 Subject: [PATCH 4/4] Remove debugging code --- qiskit/providers/ibmq/ibmqbackend.py | 2 -- test/ibmq/test_ibmq_job.py | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/qiskit/providers/ibmq/ibmqbackend.py b/qiskit/providers/ibmq/ibmqbackend.py index 966d6a1d1..6dd38f2e4 100644 --- a/qiskit/providers/ibmq/ibmqbackend.py +++ b/qiskit/providers/ibmq/ibmqbackend.py @@ -194,8 +194,6 @@ def retrieve_job(self, job_id): """ try: job_info = self._api.get_job(job_id) - print(job_info['backend']['name']) - print(self.name()) if job_info['backend']['name'] != self.name(): warnings.warn('Job "{}" belongs to another backend than the one queried. ' 'The query was made on backend "{}", ' diff --git a/test/ibmq/test_ibmq_job.py b/test/ibmq/test_ibmq_job.py index eccc3cb74..1cbcfffe8 100644 --- a/test/ibmq/test_ibmq_job.py +++ b/test/ibmq/test_ibmq_job.py @@ -269,7 +269,7 @@ def test_retrieve_job(self, qe_token, qe_url): else: self.assertEqual(job.qobj(), None) - #@slow_test + @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.""" @@ -287,7 +287,6 @@ def test_retrieve_job_uses_appropriate_backend(self, qe_token, qe_url): # 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()) - print(job_real.backend().name(), real_backend.name()) self.assertEqual(real_backend.retrieve_job(job_real.job_id()).backend().name(), real_backend.name())