Skip to content

Commit 5de0bf3

Browse files
authored
[Compute] az vm create: Add new parameter --zone-placement-policy to support setting vm placement to create a zonal VM (#31233)
1 parent 223b643 commit 5de0bf3

File tree

5 files changed

+3144
-4
lines changed

5 files changed

+3144
-4
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,12 +471,16 @@ def load_arguments(self, _):
471471
c.argument('enable_vtpm', enable_vtpm_type)
472472
c.argument('user_data', help='UserData for the VM. It can be passed in as file or string.', completer=FilesCompleter(), type=file_type, min_api='2021-03-01')
473473
c.argument('enable_hibernation', arg_type=get_three_state_flag(), min_api='2021-03-01', help='The flag that enable or disable hibernation capability on the VM.')
474+
c.argument('zone_placement_policy', arg_type=get_enum_type(self.get_models('ZonePlacementPolicyType')), min_api='2024-11-01', help="Specify the policy for virtual machine's placement in availability zone")
475+
c.argument('include_zones', nargs='+', min_api='2024-11-01', help='If "--zone-placement-policy" is set to "Any", availability zone selected by the system must be present in the list of availability zones passed with "--include-zones". If "--include-zones" is not provided, all availability zones in region will be considered for selection.')
476+
c.argument('exclude_zones', nargs='+', min_api='2024-11-01', help='If "--zone-placement-policy" is set to "Any", availability zone selected by the system must not be present in the list of availability zones passed with "excludeZones". If "--exclude-zones" is not provided, all availability zones in region will be considered for selection.')
474477

475478
for scope in ['vm create', 'vm update']:
476479
with self.argument_context(scope) as c:
477480
c.argument('additional_scheduled_events', options_list=['--additional-scheduled-events', '--additional-events'], arg_type=get_three_state_flag(), min_api='2024-07-01', help='The configuration parameter used while creating event grid and resource graph scheduled event setting.')
478481
c.argument('enable_user_reboot_scheduled_events', options_list=['--enable-user-reboot-scheduled-events', '--enable-reboot'], arg_type=get_three_state_flag(), min_api='2024-07-01', help='The configuration parameter used while publishing scheduled events additional publishing targets.')
479482
c.argument('enable_user_redeploy_scheduled_events', options_list=['--enable-user-redeploy-scheduled-events', '--enable-redeploy'], arg_type=get_three_state_flag(), min_api='2024-07-01', help='The configuration parameter used while creating user initiated redeploy scheduled event setting creation.')
483+
c.argument('align_regional_disks_to_vm_zone', options_list=['--align-regional-disks-to-vm-zone', '--align-regional-disks'], arg_type=get_three_state_flag(), min_api='2024-11-01', help='Specify whether the regional disks should be aligned/moved to the VM zone. This is applicable only for VMs with placement property set. Please note that this change is irreversible.')
480484

481485
with self.argument_context('vm create', arg_group='Storage') as c:
482486
c.argument('attach_os_disk', help='Attach an existing OS disk to the VM. Can use the name or ID of a managed disk or the URI to an unmanaged disk VHD.')

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,8 @@ def build_vm_resource( # pylint: disable=too-many-locals, too-many-statements,
308308
capacity_reservation_group=None, enable_hibernation=None, v_cpus_available=None, v_cpus_per_core=None,
309309
os_disk_security_encryption_type=None, os_disk_secure_vm_disk_encryption_set=None, disk_controller_type=None,
310310
enable_proxy_agent=None, proxy_agent_mode=None, additional_scheduled_events=None,
311-
enable_user_reboot_scheduled_events=None, enable_user_redeploy_scheduled_events=None):
311+
enable_user_reboot_scheduled_events=None, enable_user_redeploy_scheduled_events=None,
312+
zone_placement_policy=None, include_zones=None, exclude_zones=None, align_regional_disks_to_vm_zone=None):
312313

313314
os_caching = disk_info['os'].get('caching')
314315

@@ -572,6 +573,9 @@ def _build_storage_profile():
572573
if disk_controller_type is not None:
573574
profile['diskControllerType'] = disk_controller_type
574575

576+
if align_regional_disks_to_vm_zone is not None:
577+
profile['alignRegionalDisksToVMZone'] = align_regional_disks_to_vm_zone
578+
575579
return profile
576580

577581
vm_properties = {'hardwareProfile': {'vmSize': size}, 'networkProfile': {'networkInterfaces': nics},
@@ -727,6 +731,16 @@ def _build_storage_profile():
727731
if edge_zone:
728732
vm['extendedLocation'] = edge_zone
729733

734+
placement = {}
735+
if zone_placement_policy is not None:
736+
placement['zonePlacementPolicy'] = zone_placement_policy
737+
if include_zones is not None:
738+
placement['includeZones'] = include_zones
739+
if exclude_zones is not None:
740+
placement['excludeZones'] = exclude_zones
741+
if placement:
742+
vm['Placement'] = placement
743+
730744
return vm
731745

732746

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,8 @@ def create_vm(cmd, vm_name, resource_group_name, image=None, size='Standard_DS1_
825825
proxy_agent_mode=None, source_snapshots_or_disks=None, source_snapshots_or_disks_size_gb=None,
826826
source_disk_restore_point=None, source_disk_restore_point_size_gb=None, ssh_key_type=None,
827827
additional_scheduled_events=None, enable_user_reboot_scheduled_events=None,
828-
enable_user_redeploy_scheduled_events=None):
828+
enable_user_redeploy_scheduled_events=None, zone_placement_policy=None, include_zones=None,
829+
exclude_zones=None, align_regional_disks_to_vm_zone=None):
829830

830831
from azure.cli.core.commands.client_factory import get_subscription_id
831832
from azure.cli.core.util import random_string, hash_string
@@ -1049,7 +1050,9 @@ def create_vm(cmd, vm_name, resource_group_name, image=None, size='Standard_DS1_
10491050
disk_controller_type=disk_controller_type, enable_proxy_agent=enable_proxy_agent,
10501051
proxy_agent_mode=proxy_agent_mode, additional_scheduled_events=additional_scheduled_events,
10511052
enable_user_reboot_scheduled_events=enable_user_reboot_scheduled_events,
1052-
enable_user_redeploy_scheduled_events=enable_user_redeploy_scheduled_events)
1053+
enable_user_redeploy_scheduled_events=enable_user_redeploy_scheduled_events,
1054+
zone_placement_policy=zone_placement_policy, include_zones=include_zones, exclude_zones=exclude_zones,
1055+
align_regional_disks_to_vm_zone=align_regional_disks_to_vm_zone)
10531056

10541057
vm_resource['dependsOn'] = vm_dependencies
10551058

@@ -1577,7 +1580,8 @@ def update_vm(cmd, resource_group_name, vm_name, os_disk=None, disk_caching=None
15771580
dedicated_host=None, dedicated_host_group=None, size=None, ephemeral_os_disk_placement=None,
15781581
enable_hibernation=None, v_cpus_available=None, v_cpus_per_core=None, disk_controller_type=None,
15791582
security_type=None, enable_proxy_agent=None, proxy_agent_mode=None, additional_scheduled_events=None,
1580-
enable_user_reboot_scheduled_events=None, enable_user_redeploy_scheduled_events=None, **kwargs):
1583+
enable_user_reboot_scheduled_events=None, enable_user_redeploy_scheduled_events=None,
1584+
align_regional_disks_to_vm_zone=None, **kwargs):
15811585
from azure.mgmt.core.tools import parse_resource_id, resource_id, is_valid_resource_id
15821586
from ._vm_utils import update_write_accelerator_settings, update_disk_caching
15831587
SecurityProfile, UefiSettings = cmd.get_models('SecurityProfile', 'UefiSettings')
@@ -1598,6 +1602,9 @@ def update_vm(cmd, resource_group_name, vm_name, os_disk=None, disk_caching=None
15981602
vm.storage_profile.os_disk.managed_disk.id = disk_id
15991603
vm.storage_profile.os_disk.name = disk_name
16001604

1605+
if align_regional_disks_to_vm_zone is not None:
1606+
vm.storage_profile.align_regional_disks_to_vm_zone = align_regional_disks_to_vm_zone
1607+
16011608
from ._constants import COMPATIBLE_SECURITY_TYPE_VALUE
16021609
if security_type == "TrustedLaunch":
16031610
from azure.cli.core.azclierror import InvalidArgumentValueError

0 commit comments

Comments
 (0)