This is an automated email from the ASF dual-hosted git repository.
dabla pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 9c1f5d894e6 Replace the scan of container groups in a resource group
with a direct in AzureContainerInstanceHook (#63567)
9c1f5d894e6 is described below
commit 9c1f5d894e6cc4873cdb8553f602e9d56d2a38e7
Author: SameerMesiah97 <[email protected]>
AuthorDate: Mon Mar 23 21:47:13 2026 +0000
Replace the scan of container groups in a resource group with a direct in
AzureContainerInstanceHook (#63567)
container_groups.get(resource_group, name) call. This avoids listing and
pagination when checking whether a container group exists.
Update tests to mock container_groups.get and cover success, not found, and
error cases.
Co-authored-by: Sameer Mesiah <[email protected]>
---
.../microsoft/azure/hooks/container_instance.py | 10 +++---
.../azure/hooks/test_container_instance.py | 40 +++++++++++-----------
2 files changed, 26 insertions(+), 24 deletions(-)
diff --git
a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py
b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py
index 08aa6251f2e..bfb7940ec21 100644
---
a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py
+++
b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/hooks/container_instance.py
@@ -21,6 +21,7 @@ from functools import cached_property
from typing import TYPE_CHECKING, Any, cast
from azure.common.client_factory import get_client_from_auth_file,
get_client_from_json_dict
+from azure.core.exceptions import ResourceNotFoundError
from azure.identity import ClientSecretCredential, DefaultAzureCredential
from azure.mgmt.containerinstance import ContainerInstanceManagementClient
@@ -154,10 +155,11 @@ class AzureContainerInstanceHook(AzureBaseHook):
:param resource_group: the name of the resource group
:param name: the name of the container group
"""
- for container in
self.connection.container_groups.list_by_resource_group(resource_group):
- if container.name == name:
- return True
- return False
+ try:
+ self.connection.container_groups.get(resource_group, name)
+ return True
+ except ResourceNotFoundError:
+ return False
def test_connection(self):
"""Test a configured Azure Container Instance connection."""
diff --git
a/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_container_instance.py
b/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_container_instance.py
index 38b2c743d57..850409dcc3f 100644
---
a/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_container_instance.py
+++
b/providers/microsoft/azure/tests/unit/microsoft/azure/hooks/test_container_instance.py
@@ -20,9 +20,8 @@ from __future__ import annotations
from unittest.mock import MagicMock, patch
import pytest
+from azure.core.exceptions import ResourceNotFoundError
from azure.mgmt.containerinstance.models import (
- Container,
- ContainerGroup,
Logs,
ResourceRequests,
ResourceRequirements,
@@ -96,25 +95,26 @@ class TestAzureContainerInstanceHook:
self.hook.delete("resource_group", "aci-test")
delete_mock.assert_called_once_with("resource_group", "aci-test")
-
@patch("azure.mgmt.containerinstance.operations.ContainerGroupsOperations.list_by_resource_group")
- def test_exists_with_existing(self, list_mock):
- list_mock.return_value = [
- ContainerGroup(
- os_type="Linux",
- containers=[Container(name="test1", image="hello-world",
resources=self.resources)],
- )
- ]
- assert not self.hook.exists("test", "test1")
-
-
@patch("azure.mgmt.containerinstance.operations.ContainerGroupsOperations.list_by_resource_group")
- def test_exists_with_not_existing(self, list_mock):
- list_mock.return_value = [
- ContainerGroup(
- os_type="Linux",
- containers=[Container(name="test1", image="hello-world",
resources=self.resources)],
- )
- ]
+
@patch("azure.mgmt.containerinstance.operations.ContainerGroupsOperations.get")
+ def test_exists_with_existing(self, get_mock):
+ get_mock.return_value = MagicMock()
+
+ assert self.hook.exists("test", "test1")
+ get_mock.assert_called_once_with("test", "test1")
+
+
@patch("azure.mgmt.containerinstance.operations.ContainerGroupsOperations.get")
+ def test_exists_with_not_existing(self, get_mock):
+ get_mock.side_effect = ResourceNotFoundError("not found")
+
assert not self.hook.exists("test", "not found")
+ get_mock.assert_called_once_with("test", "not found")
+
+
@patch("azure.mgmt.containerinstance.operations.ContainerGroupsOperations.get")
+ def test_exists_unexpected_exception(self, get_mock):
+ get_mock.side_effect = RuntimeError("Unexpected Exception")
+
+ with pytest.raises(RuntimeError):
+ self.hook.exists("test", "test")
@patch("azure.mgmt.containerinstance.operations.ContainerGroupsOperations.list")
def test_connection_success(self, mock_container_groups_list):