From 1c04e79755600449afaa32cee09bc1d240b1752d Mon Sep 17 00:00:00 2001 From: merav-aharoni Date: Mon, 30 Oct 2023 18:06:42 +0200 Subject: [PATCH] Added close_session (#762) * Added close_session * black * Added implementation for closing a session + test * add self url --------- Co-authored-by: kevin-tian --- qiskit_ibm_provider/api/clients/runtime.py | 8 ++++++++ qiskit_ibm_provider/api/rest/runtime_session.py | 17 ++++++++++++++++- qiskit_ibm_provider/ibm_backend.py | 10 ++++++++++ test/integration/test_session.py | 11 ++++++++++- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/qiskit_ibm_provider/api/clients/runtime.py b/qiskit_ibm_provider/api/clients/runtime.py index a6a4cad3b..84a42bfbe 100644 --- a/qiskit_ibm_provider/api/clients/runtime.py +++ b/qiskit_ibm_provider/api/clients/runtime.py @@ -317,3 +317,11 @@ def close_session(self, session_id: str) -> None: session_id (str): the id of the session to close """ self._api.runtime_session(session_id=session_id).close() + + def cancel_session(self, session_id: str) -> None: + """Cancel session + + Args: + session_id (str): the id of the session to cancel + """ + self._api.runtime_session(session_id=session_id).cancel() diff --git a/qiskit_ibm_provider/api/rest/runtime_session.py b/qiskit_ibm_provider/api/rest/runtime_session.py index a9a3a2f9b..fb8aa94c8 100644 --- a/qiskit_ibm_provider/api/rest/runtime_session.py +++ b/qiskit_ibm_provider/api/rest/runtime_session.py @@ -14,6 +14,8 @@ from qiskit_ibm_provider.api.rest.base import RestAdapterBase +from qiskit_ibm_provider.exceptions import IBMApiError +from ..exceptions import RequestsApiError from ..session import RetrySession @@ -21,6 +23,7 @@ class RuntimeSession(RestAdapterBase): """Rest adapter for session related endpoints.""" URL_MAP = { + "self": "", "close": "/close", } @@ -37,6 +40,18 @@ def __init__( super().__init__(session, "{}/sessions/{}".format(url_prefix, session_id)) def close(self) -> None: - """Close this session.""" + """Set accepting_jobs flag to false, so no more jobs can be submitted.""" + payload = {"accepting_jobs": False} + url = self.get_url("self") + try: + self.session.patch(url, json=payload) + except RequestsApiError as ex: + if ex.status_code == 404: + pass + else: + raise IBMApiError(f"Error closing session: {ex}") + + def cancel(self) -> None: + """Cancel this session.""" url = self.get_url("close") self.session.delete(url) diff --git a/qiskit_ibm_provider/ibm_backend.py b/qiskit_ibm_provider/ibm_backend.py index 87a5c3295..1152a46cd 100644 --- a/qiskit_ibm_provider/ibm_backend.py +++ b/qiskit_ibm_provider/ibm_backend.py @@ -883,6 +883,16 @@ def session(self) -> Session: def cancel_session(self) -> None: """Cancel session. All pending jobs will be cancelled.""" + if self._session: + self._session.cancel() + if self._session.session_id: + self.provider._runtime_client.cancel_session(self._session.session_id) + self._session = None + + def close_session(self) -> None: + """Close the session so new jobs will no longer be accepted, but existing + queued or running jobs will run to completion. The session will be terminated once there + are no more pending jobs.""" if self._session: self._session.cancel() if self._session.session_id: diff --git a/test/integration/test_session.py b/test/integration/test_session.py index ba992ac14..4ecd539e6 100644 --- a/test/integration/test_session.py +++ b/test/integration/test_session.py @@ -62,7 +62,7 @@ def test_backend_run_with_session(self): ) def test_session_cancel(self): - """Test closing a session""" + """Test canceling a session""" provider = IBMProvider(self.dependencies.token, self.dependencies.url) backend = provider.get_backend("ibmq_qasm_simulator") backend.open_session() @@ -70,6 +70,15 @@ def test_session_cancel(self): backend.cancel_session() self.assertIsNone(backend.session) + def test_session_close(self): + """Test closing a session""" + provider = IBMProvider(self.dependencies.token, self.dependencies.url) + backend = provider.get_backend("ibmq_qasm_simulator") + backend.open_session() + self.assertTrue(backend.session.active) + backend.close_session() + self.assertIsNone(backend.session) + def test_run_after_cancel(self): """Test running after session is cancelled.""" provider = IBMProvider(self.dependencies.token, self.dependencies.url)