Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
50ffbe7
Adjusted acr module recordings for updated api versions
CodeJourneys Feb 5, 2026
47599ea
Removed models version reference from test mock
CodeJourneys Feb 5, 2026
77a0543
Removed API versions from ResourceType.MGMT_CONTAINERREGISTRY in _sha…
CodeJourneys Feb 5, 2026
d9b7ac8
Refactor ACR network rule handling to support virtual network rules a…
CodeJourneys Mar 10, 2026
c59ffed
Add transformation for network rule commands to standardize responses
CodeJourneys Mar 10, 2026
168a2e5
Merge branch 'dev' into acr-module-reconcile-tasks-split-feb2026
CodeJourneys Mar 10, 2026
1b24f1b
Merge branch 'dev' into acr-module-reconcile-tasks-split-feb2026
CodeJourneys Mar 17, 2026
427330a
Applied linter fixes
CodeJourneys Mar 17, 2026
0074071
{Dependencies} Update azure-mgmt-containerregistry to 14.1.0b4 and ad…
CodeJourneys Mar 17, 2026
e9e2c53
{Core} Add MGMT_CONTAINERREGISTRYTASKS resource type to ResourceType …
CodeJourneys Mar 17, 2026
278968f
Implement ACR tasks service client and update related functions
CodeJourneys Mar 17, 2026
970d265
Refactor ACR command modules to import models directly from azure.mgm…
CodeJourneys Mar 17, 2026
f0092ed
Refactor acr_task_create and acr_task_update to import models directl…
CodeJourneys Mar 18, 2026
c7705ae
Refactor polling methods to remove unnecessary cmd parameter from get…
CodeJourneys Mar 18, 2026
bcf4136
Refactor ACR task-related functions to remove cmd parameter and impor…
CodeJourneys Mar 18, 2026
40220dd
Refactor get_run_with_polling to remove cmd parameter from get_acr_ta…
CodeJourneys Mar 18, 2026
f9d642e
Refactor get_run_with_polling to remove cmd parameter and update RunP…
CodeJourneys Mar 18, 2026
c696f62
Refactor delete_agentpool_with_polling and RunPolling to remove cmd p…
CodeJourneys Mar 18, 2026
1aeb460
Refactor ACR utility functions to import models directly from azure.m…
CodeJourneys Mar 18, 2026
2b0b85c
Refactor ACR functions to remove cmd parameter from get_validate_plat…
CodeJourneys Mar 18, 2026
09b3d95
Update azure-mgmt-containerregistry dependency to version 15.1.0b1
CodeJourneys Mar 23, 2026
e17082e
Update azure-mgmt-containerregistry dependency to version 15.1.0b1 in…
CodeJourneys Mar 23, 2026
81241f2
Add azure-mgmt-containerregistrytasks dependency version 1.0.0b1 to r…
CodeJourneys Mar 23, 2026
d7cc153
Refactor acr module test recordings (cassetts) for api 2026-01-01-pre…
CodeJourneys Mar 23, 2026
9c62c34
Update ACR service client API version to 2026-01-01-preview in cache,…
CodeJourneys Mar 23, 2026
8fd35df
Add API version 2026-01-01-preview to AD_HOC_API_VERSIONS
CodeJourneys Mar 23, 2026
0a8888f
Refactor polling methods to use models from azure.mgmt.containerregis…
CodeJourneys Mar 23, 2026
419bd77
Refactor ACR task and token modules to standardize values parameter n…
CodeJourneys Mar 23, 2026
62c756e
Update ACR connected registries client to use API version 2026-01-01-…
CodeJourneys Mar 23, 2026
edb3286
Remove outdated ACR API versions and retain only the latest version 2…
CodeJourneys Mar 23, 2026
6dade65
Remove deprecated ACR network rules API version and refactor related …
CodeJourneys Mar 23, 2026
296b839
Remove specific API version references from ACR client factory and si…
CodeJourneys Mar 23, 2026
6c4caf3
Refactor polling functions to remove unnecessary 'cmd' parameter for …
CodeJourneys Mar 23, 2026
1558a2f
Merge branch 'dev' into acr-module-reconcile-tasks-split-feb2026
CodeJourneys Mar 23, 2026
c512307
Refactor ACR network rule list function to utilize formatted registry…
CodeJourneys Mar 23, 2026
b1bdce6
Updated acr module acr_cache test recording
CodeJourneys Mar 23, 2026
6f95cef
Updated acr module acr_network_rule test recording
CodeJourneys Mar 23, 2026
2b60036
Updated acr module acr_cache test recording
CodeJourneys Mar 23, 2026
9d9e001
Updated acr module acr_agentpool test recording
CodeJourneys Mar 23, 2026
8e63fa9
Corrected linter errors
CodeJourneys Mar 24, 2026
021cd50
Updated test recordings
CodeJourneys Mar 24, 2026
1a14345
test: re-record 27 ACR scenario tests against 2026-01-01-preview
CodeJourneys Mar 24, 2026
b9ca6c9
test: mask secrets in 4 ACR scenario test recordings
CodeJourneys Mar 24, 2026
915cac1
fix: use ScopeMap model in create_default_scope_map for SDK compatibi…
CodeJourneys Mar 24, 2026
4201a17
fix: use RunUpdateParameters model in acr_task_update_run for SDK com…
CodeJourneys Mar 24, 2026
67c29fb
fix: handle clearing source registry identity in get_source_and_custo…
CodeJourneys Mar 24, 2026
571fa11
fix: update import statements to use containerregistrytasks models fo…
CodeJourneys Mar 24, 2026
b1c438b
test: add Entra SP propagation sleeps to fix flaky acr task abac tests
CodeJourneys Mar 24, 2026
820f7c4
tests: update ACR API version in private endpoint test recordings (20…
CodeJourneys Mar 24, 2026
4dea316
tests: update ACR API version in appservice/resource recordings (2025…
CodeJourneys Mar 24, 2026
8740f52
tests: re-record ACR/containerapp cassettes for api-version 2026-01-0…
CodeJourneys Mar 24, 2026
8065f5d
tests: mask secrets in containerapp ACR recording cassettes
CodeJourneys Mar 24, 2026
4534369
tests: re-record cassettes for api-version 2026-01-01-preview and mas…
CodeJourneys Mar 24, 2026
dd6fce3
refactor: replace json.loads with response.http_response.json() for i…
CodeJourneys Mar 24, 2026
8f1bb3e
refactor: remove unused get_acr_task_models function and consolidate …
CodeJourneys Mar 24, 2026
55e3cbc
tests: mask sensitive information in ACR credential recordings
CodeJourneys Mar 24, 2026
0499f55
Revert "refactor: replace json.loads with response.http_response.json…
CodeJourneys Mar 25, 2026
26494e4
Updated recording for test_acr_connectedregistry_dedicated_endpoint_n…
CodeJourneys Mar 25, 2026
0a5c7c8
Updated recording for test_acr_create_abac
CodeJourneys Mar 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 3 additions & 21 deletions src/azure-cli-core/azure/cli/core/profiles/_shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class ResourceType(Enum): # pylint: disable=too-few-public-methods
MGMT_NETWORK_PRIVATEDNS = ('azure.mgmt.privatedns', 'PrivateDnsManagementClient')
MGMT_AUTHORIZATION = ('azure.mgmt.authorization', 'AuthorizationManagementClient')
MGMT_CONTAINERREGISTRY = ('azure.mgmt.containerregistry', 'ContainerRegistryManagementClient')
MGMT_CONTAINERREGISTRYTASKS = ('azure.mgmt.containerregistrytasks', 'ContainerRegistryTasksMgmtClient')
MGMT_RESOURCE_FEATURES = ('azure.mgmt.resource.features', 'FeatureClient')
MGMT_RESOURCE_LINKS = ('azure.mgmt.resource.links', 'ManagementLinkClient')
MGMT_RESOURCE_LOCKS = ('azure.mgmt.resource.locks', 'ManagementLockClient')
Expand Down Expand Up @@ -187,15 +188,8 @@ def default_api_version(self):
ResourceType.MGMT_NETWORK_PRIVATEDNS: None,
ResourceType.MGMT_KEYVAULT: None,
ResourceType.MGMT_AUTHORIZATION: None,
ResourceType.MGMT_CONTAINERREGISTRY: SDKProfile('2025-03-01-preview', {
'agent_pools': '2025-03-01-preview',
'tasks': '2025-03-01-preview',
'task_runs': '2025-03-01-preview',
'runs': '2025-03-01-preview',
'network_rule': '2021-08-01-preview',
'cache_rules': '2023-01-01-preview',
'credential_sets': '2023-01-01-preview'
}),
ResourceType.MGMT_CONTAINERREGISTRY: None,
ResourceType.MGMT_CONTAINERREGISTRYTASKS: None,
# The order does make things different.
# Please keep ResourceType.DATA_KEYVAULT_KEYS before ResourceType.DATA_KEYVAULT
ResourceType.DATA_KEYVAULT_CERTIFICATES: None,
Expand Down Expand Up @@ -234,18 +228,6 @@ def default_api_version(self):
# src/azure-cli/azure/cli/command_modules/appservice/_constants.py:68
'app_service_certificate_orders': '2022-09-01'
},
ResourceType.MGMT_CONTAINERREGISTRY: {
# src/azure-cli/azure/cli/command_modules/acr/_client_factory.py:8
'VERSION_2019_05_01_PREVIEW': "2019-05-01-preview",
'VERSION_2019_06_01_PREVIEW': "2019-06-01-preview",
'VERSION_2020_11_01_PREVIEW': "2020-11-01-preview",
'VERSION_2021_08_01_PREVIEW': "2021-08-01-preview",
'VERSION_2022_02_01_PREVIEW': "2022-02-01-preview",
'VERSION_2023_11_01_PREVIEW': "2023-11-01-preview",
'VERSION_2024_11_01_PREVIEW': "2024-11-01-preview",
'VERSION_2025_03_01_PREVIEW': "2025-03-01-preview",
'VERSION_2025_04_01': "2025-04-01"
},
ResourceType.MGMT_MSI: {
'user_assigned_identities': '2022-01-31-preview',
}
Expand Down
26 changes: 10 additions & 16 deletions src/azure-cli/azure/cli/command_modules/acr/_agentpool_polling.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,57 +3,51 @@
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

import json
import time

from msrest import Deserializer
from azure.core.exceptions import HttpResponseError
from azure.core.polling import PollingMethod, LROPoller

from ._constants import get_acr_task_models, get_succeeded_agentpool_status, get_finished_agentpool_status
from ._constants import get_succeeded_agentpool_status, get_finished_agentpool_status


def delete_agentpool_with_polling(cmd,
client,
def delete_agentpool_with_polling(client,
agent_pool_name,
registry_name,
resource_group_name):
deserializer = Deserializer(
{k: v for k, v in get_acr_task_models(cmd).__dict__.items() if isinstance(v, type)})
from azure.mgmt.containerregistrytasks.models import AgentPool

def deserialize_agentpool(response):
return deserializer('AgentPool', response)
return AgentPool(json.loads(response.http_response.text()))

return LROPoller(
client=client,
initial_response=client.get(
resource_group_name, registry_name, agent_pool_name, cls=lambda x, y, z: x),
deserialization_callback=deserialize_agentpool,
polling_method=RunPolling(
cmd=cmd,
registry_name=registry_name,
agent_pool_name=agent_pool_name
))


class RunPolling(PollingMethod): # pylint: disable=too-many-instance-attributes

def __init__(self, cmd, registry_name, agent_pool_name, timeout=30):
self._cmd = cmd
def __init__(self, registry_name, agent_pool_name, timeout=30):
self._registry_name = registry_name
self._agent_pool_name = agent_pool_name
self._timeout = timeout
self._client = None
self._response = None # Will hold latest received response
self._url = None # The URL used to get the run
self._deserialize = None # The deserializer for Run
self.operation_status = ""
self.operation_result = None

def initialize(self, client, initial_response, deserialization_callback):
self._client = client._client # pylint: disable=protected-access
self._response = initial_response
self._url = initial_response.http_request.url
self._deserialize = deserialization_callback

self._set_operation_status(initial_response)

Expand All @@ -62,7 +56,7 @@ def run(self):
time.sleep(self._timeout)
self._update_status()

if self.operation_status not in get_succeeded_agentpool_status(self._cmd):
if self.operation_status not in get_succeeded_agentpool_status():
from knack.util import CLIError
raise CLIError("The agent pool deletion with name '{}' finished with unsuccessful status '{}'. "
"Show run details by 'az acr agentpool show -r {} -n {}'. ".format(
Expand All @@ -77,15 +71,15 @@ def status(self):
return self.operation_status

def finished(self):
return self.operation_status in get_finished_agentpool_status(self._cmd)
return self.operation_status in get_finished_agentpool_status()

def resource(self):
return self.operation_result

def _set_operation_status(self, response):
AgentPoolStatus = self._cmd.get_models('ProvisioningState')
from azure.mgmt.containerregistrytasks.models import AgentPool, ProvisioningState as AgentPoolStatus
if response.http_response.status_code == 200 or response.http_response.status_code == 404:
self.operation_result = self._deserialize(response)
self.operation_result = AgentPool(json.loads(response.http_response.text()))
self.operation_status = self.operation_result.provisioning_state or AgentPoolStatus.succeeded.value
return
raise HttpResponseError(response)
Expand Down
42 changes: 17 additions & 25 deletions src/azure-cli/azure/cli/command_modules/acr/_client_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,34 @@

from azure.cli.core.commands.client_factory import get_mgmt_service_client

VERSION_2019_05_01_PREVIEW = "2019-05-01-preview"
VERSION_2019_06_01_PREVIEW = "2019-06-01-preview"
VERSION_2020_11_01_PREVIEW = "2020-11-01-preview"
VERSION_2021_08_01_PREVIEW = "2021-08-01-preview"
VERSION_2022_02_01_PREVIEW = "2022-02-01-preview"
VERSION_2023_01_01_PREVIEW = "2023-01-01-preview"
VERSION_2024_11_01_PREVIEW = "2024-11-01-preview"
VERSION_2025_03_01_PREVIEW = "2025-03-01-preview"
VERSION_2025_04_01 = "2025-04-01"


def get_acr_service_client(cli_ctx, api_version=None):
"""Returns the client for managing container registries. """
from azure.cli.core.profiles import ResourceType
return get_mgmt_service_client(cli_ctx, ResourceType.MGMT_CONTAINERREGISTRY, api_version=api_version)


def get_acr_tasks_service_client(cli_ctx, api_version=None):
"""Returns the client for managing container registry tasks."""
from azure.cli.core.profiles import ResourceType
return get_mgmt_service_client(cli_ctx, ResourceType.MGMT_CONTAINERREGISTRYTASKS, api_version=api_version)


# The function is used in Azure and Edge and hybrid profile is used to support the different API versions.
def cf_acr_registries(cli_ctx, *_):
return get_acr_service_client(cli_ctx).registries


def cf_acr_cache(cli_ctx, *_):
return get_acr_service_client(cli_ctx, api_version=VERSION_2023_01_01_PREVIEW).cache_rules
return get_acr_service_client(cli_ctx).cache_rules


def cf_acr_cred_sets(cli_ctx, *_):
return get_acr_service_client(cli_ctx, api_version=VERSION_2023_01_01_PREVIEW).credential_sets


def cf_acr_network_rules(cli_ctx, *_):
return get_acr_service_client(cli_ctx, api_version=VERSION_2021_08_01_PREVIEW).registries
return get_acr_service_client(cli_ctx).credential_sets


def cf_acr_registries_tasks(cli_ctx, *_):
return get_acr_service_client(cli_ctx, api_version=VERSION_2025_03_01_PREVIEW).registries
return get_acr_tasks_service_client(cli_ctx).registries


def cf_acr_replications(cli_ctx, *_):
Expand All @@ -56,32 +48,32 @@ def cf_acr_private_endpoint_connections(cli_ctx, *_):


def cf_acr_tasks(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2025_03_01_PREVIEW).tasks
return get_acr_tasks_service_client(cli_ctx).tasks


def cf_acr_taskruns(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2025_03_01_PREVIEW).task_runs
return get_acr_tasks_service_client(cli_ctx).task_runs


def cf_acr_runs(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2025_03_01_PREVIEW).runs
return get_acr_tasks_service_client(cli_ctx).runs


def cf_acr_scope_maps(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2024_11_01_PREVIEW).scope_maps
return get_acr_service_client(cli_ctx).scope_maps


def cf_acr_tokens(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2024_11_01_PREVIEW).tokens
return get_acr_service_client(cli_ctx).tokens


def cf_acr_token_credentials(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2024_11_01_PREVIEW).registries
return get_acr_service_client(cli_ctx).registries


def cf_acr_agentpool(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2025_03_01_PREVIEW).agent_pools
return get_acr_tasks_service_client(cli_ctx).agent_pools


def cf_acr_connected_registries(cli_ctx, *_):
return get_acr_service_client(cli_ctx, VERSION_2025_04_01).connected_registries
return get_acr_service_client(cli_ctx).connected_registries
42 changes: 18 additions & 24 deletions src/azure-cli/azure/cli/command_modules/acr/_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
# --------------------------------------------------------------------------------------------
# pylint: disable=line-too-long

from azure.cli.core.profiles import ResourceType
from enum import Enum

ACR_RESOURCE_PROVIDER = 'Microsoft.ContainerRegistry'
Expand Down Expand Up @@ -63,47 +62,42 @@ def get_premium_sku(cmd):
return [SkuName.premium.value]


def get_valid_os(cmd):
OS = cmd.get_models('OS', operation_group='task_runs')
def get_valid_os():
from azure.mgmt.containerregistrytasks.models import OS
return [item.value.lower() for item in OS]


def get_valid_architecture(cmd):
Architecture = cmd.get_models('Architecture', operation_group='task_runs')
def get_valid_architecture():
from azure.mgmt.containerregistrytasks.models import Architecture
return [item.value.lower() for item in Architecture]


def get_valid_variant(cmd):
Variant = cmd.get_models('Variant', operation_group='task_runs')
def get_valid_variant():
from azure.mgmt.containerregistrytasks.models import Variant
return [item.value.lower() for item in Variant]


def get_finished_run_status(cmd):
RunStatus = cmd.get_models('RunStatus', operation_group='task_runs')
def get_finished_run_status():
from azure.mgmt.containerregistrytasks.models import RunStatus
return [RunStatus.succeeded.value,
RunStatus.failed.value,
RunStatus.canceled.value,
RunStatus.error.value,
RunStatus.timeout.value]


def get_succeeded_run_status(cmd):
RunStatus = cmd.get_models('RunStatus', operation_group='task_runs')
def get_succeeded_run_status():
from azure.mgmt.containerregistrytasks.models import RunStatus
return [RunStatus.succeeded.value]


def get_acr_task_models(cmd):
from azure.cli.core.profiles import get_sdk
return get_sdk(cmd.cli_ctx, ResourceType.MGMT_CONTAINERREGISTRY, 'models', operation_group='tasks')
def get_succeeded_agentpool_status():
from azure.mgmt.containerregistrytasks.models import ProvisioningState
return [ProvisioningState.succeeded.value]


def get_succeeded_agentpool_status(cmd):
AgentPoolStatus = cmd.get_models('ProvisioningState', operation_group='agent_pools')
return [AgentPoolStatus.succeeded.value]


def get_finished_agentpool_status(cmd):
AgentPoolStatus = cmd.get_models('ProvisioningState', operation_group='agent_pools')
return [AgentPoolStatus.succeeded.value,
AgentPoolStatus.failed.value,
AgentPoolStatus.canceled.value]
def get_finished_agentpool_status():
from azure.mgmt.containerregistrytasks.models import ProvisioningState
return [ProvisioningState.succeeded.value,
ProvisioningState.failed.value,
ProvisioningState.canceled.value]
5 changes: 2 additions & 3 deletions src/azure-cli/azure/cli/command_modules/acr/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,8 @@ def load_arguments(self, _): # pylint: disable=too-many-statements
TokenStatus, ZoneRedundancy, AutoGeneratedDomainNameLabelScope = self.get_models(
'PasswordName', 'DefaultAction', 'PolicyStatus', 'WebhookAction', 'WebhookStatus',
'TokenStatus', 'ZoneRedundancy', 'AutoGeneratedDomainNameLabelScope')
TaskStatus, BaseImageTriggerType, SourceRegistryLoginMode, UpdateTriggerPayloadType = self.get_models(
'TaskStatus', 'BaseImageTriggerType', 'SourceRegistryLoginMode', 'UpdateTriggerPayloadType', operation_group='tasks')
RunStatus = self.get_models('RunStatus', operation_group='runs')
from azure.mgmt.containerregistrytasks.models import (
TaskStatus, BaseImageTriggerType, SourceRegistryLoginMode, UpdateTriggerPayloadType, RunStatus)

with self.argument_context('acr') as c:
c.argument('tags', arg_type=tags_type)
Expand Down
Loading
Loading