Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,6 @@ def cf_disk_accesses(cli_ctx, _):
return _compute_client_factory(cli_ctx).disk_accesses


def cf_images(cli_ctx, _):
return _compute_client_factory(cli_ctx).images


def cf_rolling_upgrade_commands(cli_ctx, _):
return _compute_client_factory(cli_ctx).virtual_machine_scale_set_rolling_upgrades

Expand Down
4 changes: 2 additions & 2 deletions src/azure-cli/azure/cli/command_modules/vm/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
validate_asg_names_or_ids, validate_keyvault, _validate_proximity_placement_group,
validate_vm_name_for_monitor_metrics)

from azure.cli.command_modules.vm._vm_utils import MSI_LOCAL_ID
from azure.cli.command_modules.vm._vm_utils import MSI_LOCAL_ID, CachingTypes
from azure.cli.command_modules.vm._image_builder import ScriptType

from azure.cli.command_modules.monitor.validators import validate_metric_dimension
Expand All @@ -37,7 +37,7 @@ def load_arguments(self, _):
# Model imports
DiskStorageAccountTypes = self.get_models('DiskStorageAccountTypes', operation_group='disks')
SnapshotStorageAccountTypes = self.get_models('SnapshotStorageAccountTypes', operation_group='snapshots')
UpgradeMode, CachingTypes, OperatingSystemTypes = self.get_models('UpgradeMode', 'CachingTypes', 'OperatingSystemTypes')
UpgradeMode, OperatingSystemTypes = self.get_models('UpgradeMode', 'OperatingSystemTypes')
HyperVGenerationTypes = self.get_models('HyperVGenerationTypes')
DedicatedHostLicenseTypes = self.get_models('DedicatedHostLicenseTypes')
OrchestrationServiceNames, OrchestrationServiceStateAction = self.get_models('OrchestrationServiceNames', 'OrchestrationServiceStateAction', operation_group='virtual_machine_scale_sets')
Expand Down
62 changes: 57 additions & 5 deletions src/azure-cli/azure/cli/command_modules/vm/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -2161,27 +2161,33 @@ def process_image_create_namespace(cmd, namespace):
'virtualMachines', 'Microsoft.Compute')
res = parse_resource_id(res_id)
if res['type'] == 'virtualMachines':
compute_client = _compute_client_factory(cmd.cli_ctx, subscription_id=res['subscription'])
vm_info = compute_client.virtual_machines.get(res['resource_group'], res['name'])
from .operations.vm import VMShow
command_args = {
'subscription': res['subscription'],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well done!

'resource_group': res['resource_group'],
'vm_name': res['name']
}
vm_info = VMShow(cli_ctx=cmd.cli_ctx)(command_args=command_args)
source_from_vm = True
except ResourceNotFoundError:
pass

if source_from_vm:
# pylint: disable=no-member
namespace.os_type = vm_info.storage_profile.os_disk.os_type
namespace.os_type = vm_info.get('storageProfile', {}).get('osDisk', {}).get('osType')
namespace.source_virtual_machine = res_id
if namespace.data_disk_sources:
raise CLIError("'--data-disk-sources' is not allowed when capturing "
"images from virtual machines")
else:
namespace.os_blob_uri, namespace.os_disk, namespace.os_snapshot, _, _ = _figure_out_storage_source(cmd.cli_ctx, namespace.resource_group_name, namespace.source) # pylint: disable=line-too-long
namespace.os_blob_uri, namespace.os_disk, namespace.os_snapshot, _, _ = \
_figure_out_storage_source_by_aaz(cmd.cli_ctx, namespace.resource_group_name, namespace.source)
namespace.data_blob_uris = []
namespace.data_disks = []
namespace.data_snapshots = []
if namespace.data_disk_sources:
for data_disk_source in namespace.data_disk_sources:
source_blob_uri, source_disk, source_snapshot, _, _ = _figure_out_storage_source(
source_blob_uri, source_disk, source_snapshot, _, _ = _figure_out_storage_source_by_aaz(
cmd.cli_ctx, namespace.resource_group_name, data_disk_source)
if source_blob_uri:
namespace.data_blob_uris.append(source_blob_uri)
Expand Down Expand Up @@ -2218,6 +2224,30 @@ def _figure_out_storage_source(cli_ctx, resource_group_name, source):
return (source_blob_uri, source_disk, source_snapshot, source_restore_point, source_info)


def _figure_out_storage_source_by_aaz(cli_ctx, resource_group_name, source):
source_blob_uri = None
source_disk = None
source_snapshot = None
source_info = None
source_restore_point = None
if urlparse(source).scheme: # a uri?
source_blob_uri = source
elif '/disks/' in source.lower():
source_disk = source
elif '/snapshots/' in source.lower():
source_snapshot = source
elif '/restorepoints/' in source.lower():
source_restore_point = source
else:
source_info, is_snapshot = _get_disk_or_snapshot_info_by_aaz(cli_ctx, resource_group_name, source)
if is_snapshot:
source_snapshot = source_info.get('id')
else:
source_disk = source_info.get('id')

return (source_blob_uri, source_disk, source_snapshot, source_restore_point, source_info)
Comment on lines +2227 to +2248
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This adds a near-duplicate of _figure_out_storage_source with only the underlying ‘get disk/snapshot info’ mechanism changed. To reduce drift and make future fixes apply to both paths, consider refactoring into a single helper that accepts a resolver function (SDK vs AAZ) or consolidating into one implementation with a strategy switch. That keeps the URI/resource-ID parsing logic in one place.

Copilot uses AI. Check for mistakes.


def _get_disk_or_snapshot_info(cli_ctx, resource_group_name, source):
compute_client = _compute_client_factory(cli_ctx)
is_snapshot = True
Expand All @@ -2231,6 +2261,28 @@ def _get_disk_or_snapshot_info(cli_ctx, resource_group_name, source):
return info, is_snapshot


def _get_disk_or_snapshot_info_by_aaz(cli_ctx, resource_group_name, source):
from .aaz.latest.snapshot import Show as SnapshotShow
from .aaz.latest.disk import Show as DiskShow
is_snapshot = True

try:
command_args = {
'resource_group': resource_group_name,
'snapshot_name': source
}
info = SnapshotShow(cli_ctx=cli_ctx)(command_args=command_args)
except ResourceNotFoundError:
command_args = {
'resource_group': resource_group_name,
'disk_name': source
}
is_snapshot = False
info = DiskShow(cli_ctx=cli_ctx)(command_args=command_args)

return info, is_snapshot


def process_disk_encryption_namespace(cmd, namespace):
namespace.disk_encryption_keyvault = _get_resource_id(cmd.cli_ctx, namespace.disk_encryption_keyvault,
namespace.resource_group_name,
Expand Down
6 changes: 6 additions & 0 deletions src/azure-cli/azure/cli/command_modules/vm/_vm_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -811,6 +811,12 @@ class VMGuestPatchClassificationLinux(Enum):
SECURITY = 'Security'


class CachingTypes(Enum):
Copy link

Copilot AI Mar 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Introducing a new CachingTypes enum with the same name as the previously SDK-sourced model type can be confusing (especially in a module where CachingTypes historically referred to an RP model). Consider renaming this local enum to something more specific (e.g., DiskCachingTypes) and updating the import in _params.py accordingly to make it clear this is a CLI-local enum.

Suggested change
class CachingTypes(Enum):
class DiskCachingTypes(Enum):

Copilot uses AI. Check for mistakes.
NONE = 'None'
READ_ONLY = 'ReadOnly'
READ_WRITE = 'ReadWrite'


class DiskCreateOptionTypes(Enum):
ATTACH = 'Attach'
COPY = 'Copy'
Expand Down
9 changes: 2 additions & 7 deletions src/azure-cli/azure/cli/command_modules/vm/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from azure.cli.command_modules.vm._client_factory import (cf_vm,
cf_vm_ext, cf_vm_ext_image,
cf_vm_image_term, cf_usage,
cf_vmss, cf_images,
cf_vmss,
cf_galleries, cf_gallery_images, cf_gallery_image_versions,
cf_proximity_placement_groups,
cf_dedicated_hosts, cf_dedicated_host_groups,
Expand Down Expand Up @@ -62,11 +62,6 @@ def load_command_table(self, _):
operation_group='availability_sets'
)

compute_image_sdk = CliCommandType(
operations_tmpl='azure.mgmt.compute.operations#ImagesOperations.{}',
client_factory=cf_images
)

compute_vm_sdk = CliCommandType(
operations_tmpl='azure.mgmt.compute.operations#VirtualMachinesOperations.{}',
client_factory=cf_vm
Expand Down Expand Up @@ -216,7 +211,7 @@ def load_command_table(self, _):
self.command_table['disk-encryption-set identity remove'] = DiskEncryptionSetIdentityRemove(loader=self)
g.custom_show_command('show', 'show_disk_encryption_set_identity')

with self.command_group('image', compute_image_sdk) as g:
with self.command_group('image') as g:
g.custom_command('create', 'create_image', validator=process_image_create_namespace)

with self.command_group('image builder', image_builder_image_templates_sdk, custom_command_type=image_builder_custom) as g:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4840,7 +4840,7 @@ interactions:
User-Agent:
- AZURECLI/2.80.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_community_gallery_operations_000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_community_gallery_operations_000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm000002\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_community_gallery_operations_000001/providers/Microsoft.Compute/virtualMachines/vm000002\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5074,7 +5074,7 @@ interactions:
User-Agent:
- AZURECLI/2.71.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm000002\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5057,7 +5057,7 @@ interactions:
User-Agent:
- AZURECLI/2.80.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm000002\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6735,7 +6735,7 @@ interactions:
User-Agent:
- AZURECLI/2.71.0 azsdk-python-core/1.31.0 Python/3.12.9 (Linux-6.8.0-1021-azure-x86_64-with-glibc2.36)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm000002\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm000002\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2002,7 +2002,7 @@ interactions:
User-Agent:
- AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.11.9 (Windows-10-10.0.26100-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm1\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4902,7 +4902,7 @@ interactions:
User-Agent:
- AZURECLI/2.71.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_update_add_set_000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_update_add_set_000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_update_add_set_000001/providers/Microsoft.Compute/virtualMachines/vm1\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8144,7 +8144,7 @@ interactions:
User-Agent:
- AZURECLI/2.71.0 azsdk-python-core/1.31.0 Python/3.12.9 (Linux-6.8.0-1021-azure-x86_64-with-glibc2.36)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_version_create_000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_version_create_000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_version_create_000001/providers/Microsoft.Compute/virtualMachines/vm1\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4986,7 +4986,7 @@ interactions:
User-Agent:
- AZURECLI/2.80.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_version_end_of_life_date_000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_version_end_of_life_date_000001/providers/Microsoft.Compute/virtualMachines/vm000002?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm000002\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_image_version_end_of_life_date_000001/providers/Microsoft.Compute/virtualMachines/vm000002\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4874,7 +4874,7 @@ interactions:
User-Agent:
- AZURECLI/2.71.0 azsdk-python-core/1.31.0 Python/3.10.11 (Windows-10-10.0.26100-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm_000007?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm_000007?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm_000007\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm_000007\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7043,7 +7043,7 @@ interactions:
User-Agent:
- AZURECLI/2.72.0 azsdk-python-core/1.31.0 Python/3.12.9 (Linux-6.8.0-1026-azure-x86_64-with-glibc2.36)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm1?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm1\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest.rg000001/providers/Microsoft.Compute/virtualMachines/vm1\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6398,7 +6398,7 @@ interactions:
User-Agent:
- AZURECLI/2.71.0 azsdk-python-core/1.31.0 Python/3.12.9 (Linux-6.8.0-1021-azure-x86_64-with-glibc2.36)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_generalize_vm000001/providers/Microsoft.Compute/virtualMachines/vm-generalize?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_generalize_vm000001/providers/Microsoft.Compute/virtualMachines/vm-generalize?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm-generalize\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_generalize_vm000001/providers/Microsoft.Compute/virtualMachines/vm-generalize\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4920,7 +4920,7 @@ interactions:
User-Agent:
- AZURECLI/2.83.0 azsdk-python-core/1.38.0 Python/3.12.10 (Windows-11-10.0.26200-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian000001/providers/Microsoft.Compute/virtualMachines/vm-unmanaged-disk?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian000001/providers/Microsoft.Compute/virtualMachines/vm-unmanaged-disk?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm-unmanaged-disk\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian000001/providers/Microsoft.Compute/virtualMachines/vm-unmanaged-disk\",\r\n
Expand Down Expand Up @@ -9548,7 +9548,7 @@ interactions:
User-Agent:
- AZURECLI/2.83.0 azsdk-python-core/1.38.0 Python/3.12.10 (Windows-11-10.0.26200-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian000001/providers/Microsoft.Compute/virtualMachines/vm-managed-disk?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian000001/providers/Microsoft.Compute/virtualMachines/vm-managed-disk?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm-managed-disk\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian000001/providers/Microsoft.Compute/virtualMachines/vm-managed-disk\",\r\n
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5984,7 +5984,7 @@ interactions:
User-Agent:
- AZURECLI/2.83.0 azsdk-python-core/1.38.0 Python/3.12.10 (Windows-11-10.0.26200-SP0)
method: GET
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian2_000001/providers/Microsoft.Compute/virtualMachines/vm-managed-disk?api-version=2024-11-01
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian2_000001/providers/Microsoft.Compute/virtualMachines/vm-managed-disk?api-version=2025-04-01
response:
body:
string: "{\r\n \"name\": \"vm-managed-disk\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_vm_custom_image_debian2_000001/providers/Microsoft.Compute/virtualMachines/vm-managed-disk\",\r\n
Expand Down
Loading
Loading