def update_vm()

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)