in src/azure-cli/azure/cli/command_modules/vm/custom.py [0:0]
def update_vm(cmd, resource_group_name, vm_name, os_disk=None, disk_caching=None,
write_accelerator=None, license_type=None, no_wait=False, ultra_ssd_enabled=None,
priority=None, max_price=None, proximity_placement_group=None, workspace=None, enable_secure_boot=None,
enable_vtpm=None, user_data=None, capacity_reservation_group=None,
dedicated_host=None, dedicated_host_group=None, size=None, ephemeral_os_disk_placement=None,
enable_hibernation=None, v_cpus_available=None, v_cpus_per_core=None, disk_controller_type=None,
security_type=None, enable_proxy_agent=None, proxy_agent_mode=None, additional_scheduled_events=None,
enable_user_reboot_scheduled_events=None, enable_user_redeploy_scheduled_events=None,
align_regional_disks_to_vm_zone=None, wire_server_mode=None, imds_mode=None,
wire_server_access_control_profile_reference_id=None, imds_access_control_profile_reference_id=None,
key_incarnation_id=None, **kwargs):
from azure.mgmt.core.tools import parse_resource_id, resource_id, is_valid_resource_id
from ._vm_utils import update_write_accelerator_settings, update_disk_caching
SecurityProfile, UefiSettings = cmd.get_models('SecurityProfile', 'UefiSettings')
vm = kwargs['parameters']
disk_name = None
if os_disk is not None:
if is_valid_resource_id(os_disk):
disk_id = os_disk
os_disk_id_parsed = parse_resource_id(os_disk)
disk_name = os_disk_id_parsed['name']
else:
vm_id_parsed = parse_resource_id(vm.id)
disk_id = resource_id(subscription=vm_id_parsed['subscription'],
resource_group=vm_id_parsed['resource_group'],
namespace='Microsoft.Compute', type='disks', name=os_disk)
disk_name = os_disk
vm.storage_profile.os_disk.managed_disk.id = disk_id
vm.storage_profile.os_disk.name = disk_name
if align_regional_disks_to_vm_zone is not None:
vm.storage_profile.align_regional_disks_to_vm_zone = align_regional_disks_to_vm_zone
from ._constants import COMPATIBLE_SECURITY_TYPE_VALUE
if security_type == "TrustedLaunch":
from azure.cli.core.azclierror import InvalidArgumentValueError
if vm.security_profile is not None and vm.security_profile.security_type == "ConfidentialVM":
raise InvalidArgumentValueError("{} is already configured with ConfidentialVM. Security Configuration "
"cannot be updated from ConfidentialVM to TrustedLaunch.".format(vm.name))
if disk_name is None and vm.storage_profile.os_disk.managed_disk is not None:
os_disk_id_parsed = parse_resource_id(vm.storage_profile.os_disk.managed_disk.id)
disk_name = os_disk_id_parsed['name']
if disk_name is not None:
# Set --enable-secure-boot True and --enable-vtpm True if not specified by end user.
enable_secure_boot = enable_secure_boot if enable_secure_boot is not None else True
enable_vtpm = enable_vtpm if enable_vtpm is not None else True
if vm.security_profile is None:
vm.security_profile = SecurityProfile()
vm.security_profile.security_type = security_type
elif security_type == COMPATIBLE_SECURITY_TYPE_VALUE:
if vm.security_profile is None:
vm.security_profile = SecurityProfile()
vm.security_profile.security_type = security_type
vm.security_profile.uefi_settings = None
if write_accelerator is not None:
update_write_accelerator_settings(vm.storage_profile, write_accelerator)
if disk_caching is not None:
update_disk_caching(vm.storage_profile, disk_caching)
if license_type is not None:
vm.license_type = license_type
if user_data is not None:
from azure.cli.core.util import b64encode
vm.user_data = b64encode(user_data)
if capacity_reservation_group is not None:
CapacityReservationProfile = cmd.get_models('CapacityReservationProfile')
SubResource = cmd.get_models('SubResource')
if capacity_reservation_group == 'None':
capacity_reservation_group = None
sub_resource = SubResource(id=capacity_reservation_group)
capacity_reservation = CapacityReservationProfile(capacity_reservation_group=sub_resource)
vm.capacity_reservation = capacity_reservation
if dedicated_host is not None:
if vm.host is None:
DedicatedHost = cmd.get_models('SubResource')
vm.host = DedicatedHost(additional_properties={}, id=dedicated_host)
else:
vm.host.id = dedicated_host
if vm.host_group is not None:
vm.host_group = None
if dedicated_host_group is not None:
if vm.host_group is None:
DedicatedHostGroup = cmd.get_models('SubResource')
vm.host_group = DedicatedHostGroup(additional_properties={}, id=dedicated_host_group)
else:
vm.host_group.id = dedicated_host_group
if vm.host is not None:
vm.host = None
if ultra_ssd_enabled is not None:
if vm.additional_capabilities is None:
AdditionalCapabilities = cmd.get_models('AdditionalCapabilities')
vm.additional_capabilities = AdditionalCapabilities(ultra_ssd_enabled=ultra_ssd_enabled)
else:
vm.additional_capabilities.ultra_ssd_enabled = ultra_ssd_enabled
if enable_hibernation is not None:
if vm.additional_capabilities is None:
AdditionalCapabilities = cmd.get_models('AdditionalCapabilities')
vm.additional_capabilities = AdditionalCapabilities(hibernation_enabled=enable_hibernation)
else:
vm.additional_capabilities.hibernation_enabled = enable_hibernation
if priority is not None:
vm.priority = priority
if max_price is not None:
if vm.billing_profile is None:
BillingProfile = cmd.get_models('BillingProfile')
vm.billing_profile = BillingProfile(max_price=max_price)
else:
vm.billing_profile.max_price = max_price
if proximity_placement_group is not None:
vm.proximity_placement_group = {'id': proximity_placement_group}
if security_type != COMPATIBLE_SECURITY_TYPE_VALUE and (enable_secure_boot is not None or enable_vtpm is not None):
if vm.security_profile is None:
vm.security_profile = SecurityProfile()
vm.security_profile.uefi_settings = UefiSettings(secure_boot_enabled=enable_secure_boot,
v_tpm_enabled=enable_vtpm)
proxy_agent_parameters = [
enable_proxy_agent, wire_server_mode, imds_mode, key_incarnation_id,
wire_server_access_control_profile_reference_id, imds_access_control_profile_reference_id
]
if any(parameter is not None for parameter in proxy_agent_parameters):
ProxyAgentSettings = cmd.get_models('ProxyAgentSettings')
HostEndpointSettings = cmd.get_models('HostEndpointSettings')
wire_server = HostEndpointSettings(
mode=wire_server_mode,
in_vm_access_control_profile_reference_id=wire_server_access_control_profile_reference_id
)
imds = HostEndpointSettings(
mode=imds_mode,
in_vm_access_control_profile_reference_id=imds_access_control_profile_reference_id
)
if vm.security_profile is None:
vm.security_profile = SecurityProfile()
vm.security_profile.proxy_agent_settings = ProxyAgentSettings(
enabled=enable_proxy_agent, key_incarnation_id=key_incarnation_id, wire_server=wire_server, imds=imds)
elif vm.security_profile.proxy_agent_settings is None:
vm.security_profile.proxy_agent_settings = ProxyAgentSettings(
enabled=enable_proxy_agent, key_incarnation_id=key_incarnation_id, wire_server=wire_server, imds=imds)
else:
vm.security_profile.proxy_agent_settings.enabled = enable_proxy_agent
vm.security_profile.proxy_agent_settings.key_incarnation_id = key_incarnation_id
vm.security_profile.proxy_agent_settings.wire_server.mode = wire_server_mode
vm.security_profile.proxy_agent_settings.wire_server.in_vm_access_control_profile_reference_id = \
wire_server_access_control_profile_reference_id
vm.security_profile.proxy_agent_settings.imds.mode = imds_mode
vm.security_profile.proxy_agent_settings.imds.in_vm_access_control_profile_reference_id = \
imds_access_control_profile_reference_id
if workspace is not None:
workspace_id = _prepare_workspace(cmd, resource_group_name, workspace)
workspace_name = parse_resource_id(workspace_id)['name']
_set_log_analytics_workspace_extension(cmd=cmd,
resource_group_name=resource_group_name,
vm=vm,
vm_name=vm_name,
workspace_name=workspace_name)
os_type = vm.storage_profile.os_disk.os_type if vm.storage_profile.os_disk.os_type else None
_set_data_source_for_workspace(cmd, os_type, resource_group_name, workspace_name)
aux_subscriptions = None
if vm and vm.storage_profile and vm.storage_profile.image_reference and 'id' in vm.storage_profile.image_reference:
aux_subscriptions = _parse_aux_subscriptions(vm.storage_profile.image_reference['id'])
if size is not None:
if vm.hardware_profile.vm_size == size:
logger.warning("VM size is already %s", size)
else:
vm.hardware_profile.vm_size = size
if v_cpus_available is not None:
vm.hardware_profile.vm_size_properties.v_cpus_available = v_cpus_available
if v_cpus_per_core is not None:
vm.hardware_profile.vm_size_properties.v_cpus_per_core = v_cpus_per_core
if ephemeral_os_disk_placement is not None:
if vm.storage_profile.os_disk.diff_disk_settings is not None:
vm.storage_profile.os_disk.diff_disk_settings.placement = ephemeral_os_disk_placement
else:
raise ValidationError("Please update the argument '--ephemeral-os-disk-placement' when "
"creating VM with the option '--ephemeral-os-disk true'")
if disk_controller_type is not None:
vm.storage_profile.disk_controller_type = disk_controller_type
if additional_scheduled_events is not None or \
enable_user_reboot_scheduled_events is not None or enable_user_redeploy_scheduled_events is not None:
if vm.scheduled_events_policy is None:
ScheduledEventsPolicy = cmd.get_models('ScheduledEventsPolicy')
UserInitiatedRedeploy = cmd.get_models('UserInitiatedRedeploy')
UserInitiatedReboot = cmd.get_models('UserInitiatedReboot')
EventGridAndResourceGraph = cmd.get_models('EventGridAndResourceGraph')
ScheduledEventsAdditionalPublishingTargets = cmd.get_models('ScheduledEventsAdditionalPublishingTargets')
vm.scheduled_events_policy = ScheduledEventsPolicy()
vm.scheduled_events_policy.scheduled_events_additional_publishing_targets = \
ScheduledEventsAdditionalPublishingTargets()
vm.scheduled_events_policy.scheduled_events_additional_publishing_targets.\
event_grid_and_resource_graph = EventGridAndResourceGraph()
vm.scheduled_events_policy.user_initiated_reboot = UserInitiatedReboot()
vm.scheduled_events_policy.user_initiated_redeploy = UserInitiatedRedeploy()
vm.scheduled_events_policy.scheduled_events_additional_publishing_targets.event_grid_and_resource_graph.\
enable = additional_scheduled_events if additional_scheduled_events is not None else False
vm.scheduled_events_policy.user_initiated_redeploy.automatically_approve = \
enable_user_redeploy_scheduled_events if enable_user_redeploy_scheduled_events is not None else False
vm.scheduled_events_policy.user_initiated_reboot.automatically_approve = \
enable_user_reboot_scheduled_events if enable_user_reboot_scheduled_events is not None else False
else:
if additional_scheduled_events is not None:
vm.scheduled_events_policy.scheduled_events_additional_publishing_targets = {
"eventGridAndResourceGraph": {
"enable": additional_scheduled_events
}
}
if enable_user_redeploy_scheduled_events is not None:
vm.scheduled_events_policy.user_initiated_redeploy = {
"automaticallyApprove": enable_user_redeploy_scheduled_events
}
if enable_user_reboot_scheduled_events is not None:
vm.scheduled_events_policy.user_initiated_reboot = {
"automaticallyApprove": enable_user_reboot_scheduled_events
}
client = _compute_client_factory(cmd.cli_ctx, aux_subscriptions=aux_subscriptions)
return sdk_no_wait(no_wait, client.virtual_machines.begin_create_or_update, resource_group_name, vm_name, **kwargs)