From c1a60eee6f8b480f6af127510178d0ba83db68b0 Mon Sep 17 00:00:00 2001 From: "Ekaterina Legacheva (AKVELON INC)" Date: Mon, 13 Jul 2026 11:43:15 -0700 Subject: [PATCH 1/8] Add support for job delete operation --- azure-quantum/azure/quantum/cirq/job.py | 2 +- azure-quantum/azure/quantum/workspace.py | 14 ++++++++++++ azure-quantum/tests/test_workspace.py | 28 ++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/azure-quantum/azure/quantum/cirq/job.py b/azure-quantum/azure/quantum/cirq/job.py index 363a03c8..6f513223 100644 --- a/azure-quantum/azure/quantum/cirq/job.py +++ b/azure-quantum/azure/quantum/cirq/job.py @@ -150,7 +150,7 @@ def cancel(self): def delete(self): """Delete the given job.""" - self._azure_job.workspace.cancel_job(self._azure_job) + self._azure_job.workspace.delete_job(self._azure_job) def __str__(self) -> str: return f"azure.quantum.cirq.Job(job_id={self.job_id()})" diff --git a/azure-quantum/azure/quantum/workspace.py b/azure-quantum/azure/quantum/workspace.py index a32ea86f..4ca36e62 100644 --- a/azure-quantum/azure/quantum/workspace.py +++ b/azure-quantum/azure/quantum/workspace.py @@ -464,6 +464,20 @@ def cancel_job(self, job: Job) -> Job: job.id) return Job(self, details) + def delete_job(self, job: Job) -> None: + """ + Deletes a job. + + :param job: + Job to delete. + """ + client = self._get_jobs_client() + client.delete( + self.subscription_id, + self.resource_group, + self.name, + job.details.id) + def get_job(self, job_id: str) -> Job: """ Returns the job corresponding to the given id. diff --git a/azure-quantum/tests/test_workspace.py b/azure-quantum/tests/test_workspace.py index da1e9c38..23547dc7 100644 --- a/azure-quantum/tests/test_workspace.py +++ b/azure-quantum/tests/test_workspace.py @@ -384,6 +384,34 @@ def test_workspace_cancel_job_success(): assert result.details.status == "Cancelled" assert result.id == job_id +def test_workspace_delete_job_success(): + ws = WorkspaceMock( + subscription_id=SUBSCRIPTION_ID, + resource_group=RESOURCE_GROUP, + name=WORKSPACE + ) + + job_id = "test-delete-success" + + details = JobDetails( + id=job_id, + name=job_id, + container_uri="http://example.com/container", + input_data_format="microsoft.resource-estimates.v2", + provider_id="ionq", + target="ionq.simulator", + status="Executing" + ) + + ws._client.services.jobs._store.append(details) + + job = Job(ws, details) + + ws.delete_job(job) + + stored_job = ws.get_job(job_id) + + assert stored_job.details.status == "Cancelled" def test_workspace_user_agent_appid(): app_id = "MyEnvVarAppId" From 7fb9d02406311f3a7e184340d3181297f2feb1ee Mon Sep 17 00:00:00 2001 From: v-elegacheva Date: Tue, 14 Jul 2026 08:55:47 -0700 Subject: [PATCH 2/8] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- azure-quantum/azure/quantum/workspace.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/azure-quantum/azure/quantum/workspace.py b/azure-quantum/azure/quantum/workspace.py index 4ca36e62..c4dc6612 100644 --- a/azure-quantum/azure/quantum/workspace.py +++ b/azure-quantum/azure/quantum/workspace.py @@ -465,12 +465,14 @@ def cancel_job(self, job: Job) -> Job: return Job(self, details) def delete_job(self, job: Job) -> None: - """ - Deletes a job. + """Deletes a job. + + Note: For service API versions before 2025-12-01-preview, the underlying + `jobs.delete` operation acts as a cancellation request rather than a hard delete. :param job: Job to delete. - """ + """ client = self._get_jobs_client() client.delete( self.subscription_id, From 70ce6e4312e92290a21d9f422e6784277be9cba3 Mon Sep 17 00:00:00 2001 From: v-elegacheva Date: Tue, 14 Jul 2026 09:03:07 -0700 Subject: [PATCH 3/8] Fix input data format in JobDetails --- azure-quantum/tests/test_workspace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-quantum/tests/test_workspace.py b/azure-quantum/tests/test_workspace.py index 23547dc7..7213dbfd 100644 --- a/azure-quantum/tests/test_workspace.py +++ b/azure-quantum/tests/test_workspace.py @@ -397,7 +397,7 @@ def test_workspace_delete_job_success(): id=job_id, name=job_id, container_uri="http://example.com/container", - input_data_format="microsoft.resource-estimates.v2", + input_data_format="microsoft.resource-estimate.v2", provider_id="ionq", target="ionq.simulator", status="Executing" From 87798dde19d669e9936af7bc6501f4cd71eb03ed Mon Sep 17 00:00:00 2001 From: "Ekaterina Legacheva (AKVELON INC)" Date: Tue, 14 Jul 2026 10:18:49 -0700 Subject: [PATCH 4/8] Add delete support to Job class --- azure-quantum/azure/quantum/job/job.py | 4 ++++ azure-quantum/tests/test_workspace.py | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/azure-quantum/azure/quantum/job/job.py b/azure-quantum/azure/quantum/job/job.py index 5ce57b9e..9ad0b957 100644 --- a/azure-quantum/azure/quantum/job/job.py +++ b/azure-quantum/azure/quantum/job/job.py @@ -55,6 +55,10 @@ def submit(self): def refresh(self): """Refreshes the Job's details by querying the workspace.""" self.details = self.workspace.get_job(self.id).details + + def delete(self): + """Delete the given job.""" + self.workspace.delete_job(self) def has_completed(self) -> bool: """Check if the job has completed.""" diff --git a/azure-quantum/tests/test_workspace.py b/azure-quantum/tests/test_workspace.py index 7213dbfd..907614db 100644 --- a/azure-quantum/tests/test_workspace.py +++ b/azure-quantum/tests/test_workspace.py @@ -413,6 +413,32 @@ def test_workspace_delete_job_success(): assert stored_job.details.status == "Cancelled" +def test_job_delete_success(): + ws = WorkspaceMock( + subscription_id=SUBSCRIPTION_ID, + resource_group=RESOURCE_GROUP, + name=WORKSPACE, + ) + + job_id = "test-job-delete-success" + details = JobDetails( + id=job_id, + name=f"job-{job_id}", + container_uri="https://example.com/container", + input_data_format="microsoft.resource-estimates.v2", + provider_id="ionq", + target="ionq.simulator", + status="Executing", + ) + ws._client.services.jobs._store.append(details) + + job = Job(ws, details) + job.delete() + + stored_job = ws.get_job(job_id) + assert stored_job.details.status == "Cancelled" + + def test_workspace_user_agent_appid(): app_id = "MyEnvVarAppId" user_agent = "MyUserAgent" From 369358c4705dd0b62aa8a710b48d78da75355f1e Mon Sep 17 00:00:00 2001 From: "Ekaterina Legacheva (AKVELON INC)" Date: Tue, 14 Jul 2026 10:36:28 -0700 Subject: [PATCH 5/8] Use delete operation in IonQ delete_job --- azure-quantum/azure/quantum/cirq/targets/ionq.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-quantum/azure/quantum/cirq/targets/ionq.py b/azure-quantum/azure/quantum/cirq/targets/ionq.py index 8c03bca0..baddf6fd 100644 --- a/azure-quantum/azure/quantum/cirq/targets/ionq.py +++ b/azure-quantum/azure/quantum/cirq/targets/ionq.py @@ -77,7 +77,7 @@ def cancel_job(self, job_id: str): def delete_job(self, job_id: str): azure_job = self._workspace.get_job(job_id) - self._workspace.cancel_job(azure_job) + self._workspace.delete_job(azure_job) def get_results( self, job_id: str, sharpen: Optional[bool] = None, extra_query_params: Optional[dict] = None From e952a37e315c6a279872b014e87a1a352887336b Mon Sep 17 00:00:00 2001 From: "Ekaterina Legacheva (AKVELON INC)" Date: Tue, 14 Jul 2026 10:39:13 -0700 Subject: [PATCH 6/8] Add delete support to Qiskit job wrapper --- azure-quantum/azure/quantum/qiskit/job.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/azure-quantum/azure/quantum/qiskit/job.py b/azure-quantum/azure/quantum/qiskit/job.py index e04a64bd..efc23cf7 100644 --- a/azure-quantum/azure/quantum/qiskit/job.py +++ b/azure-quantum/azure/quantum/qiskit/job.py @@ -108,6 +108,10 @@ def cancel(self): """Attempt to cancel the job.""" self._workspace.cancel_job(self._azure_job) + def delete(self): + """Delete the job.""" + self._workspace.delete_job(self._azure_job) + def status(self): """Return the status of the job, among the values of ``JobStatus``.""" self._azure_job.refresh() From 2ed7b717b600a69b9c2c91dbe2d284fae28953e0 Mon Sep 17 00:00:00 2001 From: "Ekaterina Legacheva (AKVELON INC)" Date: Tue, 14 Jul 2026 12:26:35 -0700 Subject: [PATCH 7/8] Update delete mock behavior and tests --- azure-quantum/tests/mock_client.py | 2 +- azure-quantum/tests/test_workspace.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/azure-quantum/tests/mock_client.py b/azure-quantum/tests/mock_client.py index cf94bb36..6a815d57 100644 --- a/azure-quantum/tests/mock_client.py +++ b/azure-quantum/tests/mock_client.py @@ -203,7 +203,7 @@ def delete( ) -> None: for jd in self._store: if jd.id == job_id: - jd.status = "Cancelled" + self._store.remove(jd) return None raise KeyError(job_id) diff --git a/azure-quantum/tests/test_workspace.py b/azure-quantum/tests/test_workspace.py index 907614db..993110dc 100644 --- a/azure-quantum/tests/test_workspace.py +++ b/azure-quantum/tests/test_workspace.py @@ -3,6 +3,7 @@ # Licensed under the MIT License. ## +import pytest import os from unittest import mock from azure.quantum.job.job import Job @@ -409,9 +410,8 @@ def test_workspace_delete_job_success(): ws.delete_job(job) - stored_job = ws.get_job(job_id) - - assert stored_job.details.status == "Cancelled" + with pytest.raises(KeyError): + ws.get_job(job_id) def test_job_delete_success(): ws = WorkspaceMock( @@ -435,8 +435,8 @@ def test_job_delete_success(): job = Job(ws, details) job.delete() - stored_job = ws.get_job(job_id) - assert stored_job.details.status == "Cancelled" + with pytest.raises(KeyError): + ws.get_job(job_id) def test_workspace_user_agent_appid(): From 2792a52174121cfa449c6d4a2e67815400e0344a Mon Sep 17 00:00:00 2001 From: v-elegacheva Date: Tue, 14 Jul 2026 12:47:48 -0700 Subject: [PATCH 8/8] Update delete_job method documentation Remove outdated note about job deletion behavior. --- azure-quantum/azure/quantum/workspace.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/azure-quantum/azure/quantum/workspace.py b/azure-quantum/azure/quantum/workspace.py index c4dc6612..f7b37f6e 100644 --- a/azure-quantum/azure/quantum/workspace.py +++ b/azure-quantum/azure/quantum/workspace.py @@ -466,10 +466,6 @@ def cancel_job(self, job: Job) -> Job: def delete_job(self, job: Job) -> None: """Deletes a job. - - Note: For service API versions before 2025-12-01-preview, the underlying - `jobs.delete` operation acts as a cancellation request rather than a hard delete. - :param job: Job to delete. """