Skip to content

Commit 6b1c304

Browse files
authored
[Compute] az vm disk attach: Add new parameters --source-snapshots-or-disks and --source-disk-restore-point to support implicit disk creation from snapshot and disk restore points(#31830)
1 parent 12e11b4 commit 6b1c304

5 files changed

Lines changed: 6763 additions & 4 deletions

File tree

src/azure-cli/azure/cli/command_modules/vm/_params.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ def load_arguments(self, _):
544544
completer=get_resource_name_completion_list('Microsoft.Compute/disks'))
545545
c.argument('ids', deprecate_info=c.deprecate(target='--ids', redirect='--disks', hide=True))
546546
c.argument('disk_ids', nargs='+', min_api='2024-03-01', help='The disk IDs of the managed disk (space-delimited).')
547+
c.argument('source_snapshots_or_disks', options_list=['--source-snapshots-or-disks', '--source-resource'], nargs='+', min_api='2024-11-01', help='Create a data disk from a snapshot or another disk. Can use the ID of a disk or snapshot.')
548+
c.argument('source_disk_restore_point', options_list=['--source-disk-restore-point', '--source-disk-rp'], nargs='+', min_api='2024-11-01', help='create a data disk from a disk restore point. Can use the ID of a disk restore point.')
547549

548550
with self.argument_context('vm disk detach') as c:
549551
c.argument('disk_name', arg_type=name_arg_type, help='The data disk name.')

src/azure-cli/azure/cli/command_modules/vm/_validators.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,8 +1886,10 @@ def validate_vmss_update_namespace(cmd, namespace): # pylint: disable=unused-ar
18861886

18871887
# region disk, snapshot, image validators
18881888
def process_vm_disk_attach_namespace(cmd, namespace):
1889-
if not namespace.disks and not namespace.disk and not namespace.disk_ids:
1890-
raise RequiredArgumentMissingError("Please use at least one of --name, --disks and --disk-ids")
1889+
if not namespace.disks and not namespace.disk and not namespace.disk_ids and \
1890+
not namespace.source_snapshots_or_disks and not namespace.source_disk_restore_point:
1891+
raise RequiredArgumentMissingError("Please use at least one of --name, --disks, --disk-ids,"
1892+
" --source-snapshots-or-disks and --source-disk-restore-point")
18911893

18921894
if namespace.disk and namespace.disks:
18931895
raise MutuallyExclusiveArgumentError("You can only specify one of --name and --disks")

src/azure-cli/azure/cli/command_modules/vm/custom.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2092,7 +2092,8 @@ def show_default_diagnostics_configuration(is_windows_os=False):
20922092

20932093
# region VirtualMachines Disks (Managed)
20942094
def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=None, disks=None, new=False, sku=None,
2095-
size_gb=None, lun=None, caching=None, enable_write_accelerator=False, disk_ids=None):
2095+
size_gb=None, lun=None, caching=None, enable_write_accelerator=False, disk_ids=None,
2096+
source_snapshots_or_disks=None, source_disk_restore_point=None):
20962097
# attach multiple managed disks using disk attach API
20972098
vm = get_vm_to_update(cmd, resource_group_name, vm_name)
20982099
if not new and not sku and not size_gb and disk_ids is not None:
@@ -2148,6 +2149,33 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
21482149
data_disk.write_accelerator_enabled = enable_write_accelerator
21492150

21502151
vm.storage_profile.data_disks.append(data_disk)
2152+
disk_lun = _get_disk_lun(vm.storage_profile.data_disks)
2153+
if source_snapshots_or_disks is not None:
2154+
for disk_item in source_snapshots_or_disks:
2155+
disk = {
2156+
'create_option': 'Copy',
2157+
'caching': caching,
2158+
'lun': disk_lun,
2159+
'writeAcceleratorEnabled': enable_write_accelerator,
2160+
"sourceResource": {
2161+
"id": disk_item
2162+
}
2163+
}
2164+
disk_lun += 1
2165+
vm.storage_profile.data_disks.append(disk)
2166+
if source_disk_restore_point is not None:
2167+
for disk_item in source_disk_restore_point:
2168+
disk = {
2169+
'create_option': 'Restore',
2170+
'caching': caching,
2171+
'lun': disk_lun,
2172+
'writeAcceleratorEnabled': enable_write_accelerator,
2173+
"sourceResource": {
2174+
"id": disk_item
2175+
}
2176+
}
2177+
disk_lun += 1
2178+
vm.storage_profile.data_disks.append(disk)
21512179

21522180
set_vm(cmd, vm)
21532181

0 commit comments

Comments
 (0)