Skip to content

Commit ca34d69

Browse files
authored
{Compute} migrate vm managed data disk attach & detach to aaz (#32781)
1 parent e2e6db3 commit ca34d69

12 files changed

+15546
-14670
lines changed

src/azure-cli/azure/cli/command_modules/backup/tests/latest/recordings/test_backup_disk_exclusion.yaml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2047,7 +2047,7 @@ interactions:
20472047
User-Agent:
20482048
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
20492049
method: GET
2050-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
2050+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
20512051
response:
20522052
body:
20532053
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -2170,7 +2170,7 @@ interactions:
21702170
User-Agent:
21712171
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
21722172
method: PUT
2173-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
2173+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
21742174
response:
21752175
body:
21762176
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -2550,7 +2550,7 @@ interactions:
25502550
User-Agent:
25512551
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
25522552
method: GET
2553-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
2553+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
25542554
response:
25552555
body:
25562556
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -2656,7 +2656,7 @@ interactions:
26562656
User-Agent:
26572657
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
26582658
method: GET
2659-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
2659+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
26602660
response:
26612661
body:
26622662
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -2787,7 +2787,7 @@ interactions:
27872787
User-Agent:
27882788
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
27892789
method: PUT
2790-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
2790+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
27912791
response:
27922792
body:
27932793
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -3066,7 +3066,7 @@ interactions:
30663066
User-Agent:
30673067
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
30683068
method: GET
3069-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
3069+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
30703070
response:
30713071
body:
30723072
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -3177,7 +3177,7 @@ interactions:
31773177
User-Agent:
31783178
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
31793179
method: GET
3180-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
3180+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
31813181
response:
31823182
body:
31833183
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -3316,7 +3316,7 @@ interactions:
33163316
User-Agent:
33173317
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
33183318
method: PUT
3319-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
3319+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
33203320
response:
33213321
body:
33223322
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n
@@ -3600,7 +3600,7 @@ interactions:
36003600
User-Agent:
36013601
- AZURECLI/2.78.0 azsdk-python-core/1.35.0 Python/3.11.9 (Windows-10-10.0.26200-SP0)
36023602
method: GET
3603-
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2024-11-01
3603+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003?api-version=2025-04-01
36043604
response:
36053605
body:
36063606
string: "{\r\n \"name\": \"clitest-vm000003\",\r\n \"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/AzureBackupRG_clitest_000001/providers/Microsoft.Compute/virtualMachines/clitest-vm000003\",\r\n

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

Lines changed: 64 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2348,12 +2348,13 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
23482348
source_snapshots_or_disks=None, source_disk_restore_point=None,
23492349
new_names_of_source_snapshots_or_disks=None, new_names_of_source_disk_restore_point=None):
23502350
# attach multiple managed disks using disk attach API
2351-
vm = get_vm_to_update(cmd, resource_group_name, vm_name)
2351+
vm = get_vm_to_update_by_aaz(cmd, resource_group_name, vm_name)
2352+
23522353
if not new and not sku and not size_gb and disk_ids is not None:
23532354
if lun:
23542355
disk_lun = lun
23552356
else:
2356-
disk_lun = _get_disk_lun(vm.storage_profile.data_disks)
2357+
disk_lun = _get_disk_lun_by_aaz(vm.get("storageProfile", {}).get("dataDisks", []))
23572358

23582359
data_disks = []
23592360
for disk_item in disk_ids:
@@ -2374,8 +2375,8 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
23742375
else:
23752376
# attach multiple managed disks using vm PUT API
23762377
from azure.mgmt.core.tools import parse_resource_id
2377-
DataDisk, ManagedDiskParameters, DiskCreateOption = cmd.get_models(
2378-
'DataDisk', 'ManagedDiskParameters', 'DiskCreateOptionTypes')
2378+
from .operations.vm import convert_show_result_to_snake_case
2379+
23792380
if size_gb is None:
23802381
default_size_gb = 1023
23812382

@@ -2386,30 +2387,46 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
23862387
if lun:
23872388
disk_lun = lun
23882389
else:
2389-
disk_lun = _get_disk_lun(vm.storage_profile.data_disks)
2390+
disk_lun = _get_disk_lun_by_aaz(vm.get("storageProfile", {}).get("dataDisks", []))
23902391

23912392
if new:
2392-
data_disk = DataDisk(lun=disk_lun, create_option=DiskCreateOption.empty,
2393-
name=parse_resource_id(disk_item)['name'],
2394-
disk_size_gb=size_gb if size_gb else default_size_gb, caching=caching,
2395-
managed_disk=ManagedDiskParameters(storage_account_type=sku))
2393+
data_disk = {
2394+
'lun': disk_lun,
2395+
'createOption': 'Empty',
2396+
'name': parse_resource_id(disk_item)['name'],
2397+
'diskSizeGB': size_gb if size_gb else default_size_gb,
2398+
'caching': caching,
2399+
'managedDisk': {
2400+
'storageAccountType': sku
2401+
}
2402+
}
23962403
else:
2397-
params = ManagedDiskParameters(id=disk_item, storage_account_type=sku)
2398-
data_disk = DataDisk(lun=disk_lun, create_option=DiskCreateOption.attach, managed_disk=params,
2399-
caching=caching)
2404+
data_disk = {
2405+
'lun': disk_lun,
2406+
'createOption': 'Attach',
2407+
'managedDisk': {
2408+
'id': disk_item,
2409+
'storageAccountType': sku
2410+
},
2411+
'caching': caching
2412+
}
24002413

24012414
if enable_write_accelerator:
2402-
data_disk.write_accelerator_enabled = enable_write_accelerator
2403-
2404-
vm.storage_profile.data_disks.append(data_disk)
2405-
disk_lun = _get_disk_lun(vm.storage_profile.data_disks)
2415+
data_disk["writeAcceleratorEnabled"] = enable_write_accelerator
2416+
2417+
if "storageProfile" not in vm:
2418+
vm["storageProfile"] = {}
2419+
if "dataDisks" not in vm["storageProfile"]:
2420+
vm["storageProfile"]["dataDisks"] = []
2421+
vm["storageProfile"]["dataDisks"].append(data_disk)
2422+
disk_lun = _get_disk_lun_by_aaz(vm.get("storageProfile", {}).get("dataDisks", []))
24062423
if source_snapshots_or_disks is not None:
24072424
if new_names_of_source_snapshots_or_disks is None:
24082425
new_names_of_source_snapshots_or_disks = [None] * len(source_snapshots_or_disks)
24092426
for disk_id, disk_name in zip(source_snapshots_or_disks, new_names_of_source_snapshots_or_disks):
24102427
disk = {
24112428
'name': disk_name,
2412-
'create_option': 'Copy',
2429+
'createOption': 'Copy',
24132430
'caching': caching,
24142431
'lun': disk_lun,
24152432
'writeAcceleratorEnabled': enable_write_accelerator,
@@ -2419,7 +2436,7 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
24192436
}
24202437
if size_gb is not None:
24212438
disk.update({
2422-
'diskSizeGb': size_gb
2439+
'diskSizeGB': size_gb
24232440
})
24242441
if sku is not None:
24252442
disk.update({
@@ -2428,14 +2445,18 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
24282445
}
24292446
})
24302447
disk_lun += 1
2431-
vm.storage_profile.data_disks.append(disk)
2448+
if "storageProfile" not in vm:
2449+
vm["storageProfile"] = {}
2450+
if "dataDisks" not in vm["storageProfile"]:
2451+
vm["storageProfile"]["dataDisks"] = []
2452+
vm["storageProfile"]["dataDisks"].append(disk)
24322453
if source_disk_restore_point is not None:
24332454
if new_names_of_source_disk_restore_point is None:
24342455
new_names_of_source_disk_restore_point = [None] * len(source_disk_restore_point)
24352456
for disk_id, disk_name in zip(source_disk_restore_point, new_names_of_source_disk_restore_point):
24362457
disk = {
24372458
'name': disk_name,
2438-
'create_option': 'Restore',
2459+
'createOption': 'Restore',
24392460
'caching': caching,
24402461
'lun': disk_lun,
24412462
'writeAcceleratorEnabled': enable_write_accelerator,
@@ -2445,7 +2466,7 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
24452466
}
24462467
if size_gb is not None:
24472468
disk.update({
2448-
'diskSizeGb': size_gb
2469+
'diskSizeGB': size_gb
24492470
})
24502471
if sku is not None:
24512472
disk.update({
@@ -2454,9 +2475,14 @@ def attach_managed_data_disk(cmd, resource_group_name, vm_name, disk=None, ids=N
24542475
}
24552476
})
24562477
disk_lun += 1
2457-
vm.storage_profile.data_disks.append(disk)
2478+
if "storageProfile" not in vm:
2479+
vm["storageProfile"] = {}
2480+
if "dataDisks" not in vm["storageProfile"]:
2481+
vm["storageProfile"]["dataDisks"] = []
2482+
vm["storageProfile"]["dataDisks"].append(disk)
24582483

2459-
set_vm(cmd, vm)
2484+
vm = convert_show_result_to_snake_case(vm)
2485+
set_vm_by_aaz(cmd, vm)
24602486

24612487

24622488
def detach_unmanaged_data_disk(cmd, resource_group_name, vm_name, disk_name):
@@ -2476,6 +2502,8 @@ def detach_unmanaged_data_disk(cmd, resource_group_name, vm_name, disk_name):
24762502

24772503

24782504
def detach_managed_data_disk(cmd, resource_group_name, vm_name, disk_name=None, force_detach=None, disk_ids=None):
2505+
from .operations.vm import convert_show_result_to_snake_case
2506+
24792507
if disk_ids is not None:
24802508
data_disks = []
24812509
for disk_item in disk_ids:
@@ -2489,27 +2517,29 @@ def detach_managed_data_disk(cmd, resource_group_name, vm_name, disk_name=None,
24892517
return result
24902518
else:
24912519
# here we handle managed disk
2492-
vm = get_vm_to_update(cmd, resource_group_name, vm_name)
2520+
vm = get_vm_to_update_by_aaz(cmd, resource_group_name, vm_name)
24932521
if not force_detach:
24942522
# pylint: disable=no-member
2495-
leftovers = [d for d in vm.storage_profile.data_disks if d.name.lower() != disk_name.lower()]
2496-
if len(vm.storage_profile.data_disks) == len(leftovers):
2523+
leftovers = [d for d in vm.get("storageProfile", {}).get("dataDisks", [])
2524+
if d["name"].lower() != disk_name.lower()]
2525+
if len(vm.get("storageProfile", {}).get("dataDisks", [])) == len(leftovers):
24972526
raise ResourceNotFoundError("No disk with the name '{}' was found".format(disk_name))
24982527
else:
2499-
DiskDetachOptionTypes = cmd.get_models('DiskDetachOptionTypes', resource_type=ResourceType.MGMT_COMPUTE,
2500-
operation_group='virtual_machines')
2501-
leftovers = vm.storage_profile.data_disks
2528+
leftovers = vm.get("storageProfile", {}).get("dataDisks", [])
25022529
is_contains = False
25032530
for d in leftovers:
2504-
if d.name.lower() == disk_name.lower():
2505-
d.to_be_detached = True
2506-
d.detach_option = DiskDetachOptionTypes.FORCE_DETACH
2531+
if d["name"].lower() == disk_name.lower():
2532+
d["toBeDetached"] = True
2533+
d["detachOption"] = "ForceDetach"
25072534
is_contains = True
25082535
break
25092536
if not is_contains:
25102537
raise ResourceNotFoundError("No disk with the name '{}' was found".format(disk_name))
2511-
vm.storage_profile.data_disks = leftovers
2512-
set_vm(cmd, vm)
2538+
if "storageProfile" not in vm:
2539+
vm["storageProfile"] = {}
2540+
vm["storageProfile"]["dataDisks"] = leftovers
2541+
vm = convert_show_result_to_snake_case(vm)
2542+
set_vm_by_aaz(cmd, vm)
25132543
# endregion
25142544

25152545

0 commit comments

Comments
 (0)