def update_vmss()

in src/azure-cli/azure/cli/command_modules/vm/custom.py [0:0]


def update_vmss(cmd, resource_group_name, name, license_type=None, no_wait=False, instance_id=None,
                protect_from_scale_in=None, protect_from_scale_set_actions=None,
                enable_terminate_notification=None, terminate_notification_time=None, ultra_ssd_enabled=None,
                scale_in_policy=None, priority=None, max_price=None, proximity_placement_group=None,
                enable_automatic_repairs=None, automatic_repairs_grace_period=None, max_batch_instance_percent=None,
                max_unhealthy_instance_percent=None, max_unhealthy_upgraded_instance_percent=None,
                pause_time_between_batches=None, enable_cross_zone_upgrade=None, prioritize_unhealthy_instances=None,
                user_data=None, enable_spot_restore=None, spot_restore_timeout=None, capacity_reservation_group=None,
                vm_sku=None, ephemeral_os_disk_placement=None, force_deletion=None, enable_secure_boot=None,
                enable_vtpm=None, automatic_repairs_action=None, v_cpus_available=None, v_cpus_per_core=None,
                regular_priority_count=None, regular_priority_percentage=None, disk_controller_type=None,
                enable_osimage_notification=None, custom_data=None, enable_hibernation=None,
                security_type=None, enable_proxy_agent=None, proxy_agent_mode=None,
                security_posture_reference_id=None, security_posture_reference_exclude_extensions=None,
                max_surge=None, enable_resilient_creation=None, enable_resilient_deletion=None,
                ephemeral_os_disk=None, ephemeral_os_disk_option=None, zones=None, additional_scheduled_events=None,
                enable_user_reboot_scheduled_events=None, enable_user_redeploy_scheduled_events=None,
                upgrade_policy_mode=None, enable_auto_os_upgrade=None, skuprofile_vmsizes=None,
                skuprofile_allostrat=None, security_posture_reference_is_overridable=None, zone_balance=None,
                wire_server_mode=None, imds_mode=None, wire_server_access_control_profile_reference_id=None,
                imds_access_control_profile_reference_id=None, enable_automatic_zone_balancing=None,
                automatic_zone_balancing_strategy=None, automatic_zone_balancing_behavior=None, **kwargs):
    vmss = kwargs['parameters']
    aux_subscriptions = None
    # pylint: disable=too-many-boolean-expressions
    if vmss and hasattr(vmss, 'virtual_machine_profile') and vmss.virtual_machine_profile and \
            vmss.virtual_machine_profile.storage_profile and \
            vmss.virtual_machine_profile.storage_profile.image_reference and \
            'id' in vmss.virtual_machine_profile.storage_profile.image_reference:
        aux_subscriptions = _parse_aux_subscriptions(vmss.virtual_machine_profile.storage_profile.image_reference['id'])
    client = _compute_client_factory(cmd.cli_ctx, aux_subscriptions=aux_subscriptions)

    VMProtectionPolicy = cmd.get_models('VirtualMachineScaleSetVMProtectionPolicy')

    # handle vmss instance update
    from azure.cli.core.util import b64encode

    if instance_id is not None:
        if license_type is not None:
            vmss.license_type = license_type

        if user_data is not None:
            vmss.user_data = b64encode(user_data)

        if not vmss.protection_policy:
            vmss.protection_policy = VMProtectionPolicy()

        if protect_from_scale_in is not None:
            vmss.protection_policy.protect_from_scale_in = protect_from_scale_in

        if protect_from_scale_set_actions is not None:
            vmss.protection_policy.protect_from_scale_set_actions = protect_from_scale_set_actions

        return sdk_no_wait(no_wait, client.virtual_machine_scale_set_vms.begin_update,
                           resource_group_name, name, instance_id, **kwargs)

    # else handle vmss update
    if license_type is not None:
        vmss.virtual_machine_profile.license_type = license_type

    if user_data is not None:
        vmss.virtual_machine_profile.user_data = b64encode(user_data)

    if v_cpus_available is not None or v_cpus_per_core is not None:
        HardwareProfile = cmd.get_models('HardwareProfile')
        VMSizeProperties = cmd.get_models('VMSizeProperties')
        hardware_profile = HardwareProfile(vm_size_properties=VMSizeProperties(v_cpus_available=v_cpus_available,
                                                                               v_cpus_per_core=v_cpus_per_core))
        vmss.virtual_machine_profile.hardware_profile = hardware_profile

    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)
        vmss.virtual_machine_profile.capacity_reservation = capacity_reservation

    if enable_terminate_notification is not None or terminate_notification_time is not None:
        if vmss.virtual_machine_profile.scheduled_events_profile is None:
            ScheduledEventsProfile = cmd.get_models('ScheduledEventsProfile')
            vmss.virtual_machine_profile.scheduled_events_profile = ScheduledEventsProfile()
        TerminateNotificationProfile = cmd.get_models('TerminateNotificationProfile')
        vmss.virtual_machine_profile.scheduled_events_profile.terminate_notification_profile =\
            TerminateNotificationProfile(not_before_timeout=terminate_notification_time,
                                         enable=enable_terminate_notification)

    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 vmss.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')
            vmss.scheduled_events_policy = ScheduledEventsPolicy()
            vmss.scheduled_events_policy.scheduled_events_additional_publishing_targets = \
                ScheduledEventsAdditionalPublishingTargets()
            vmss.scheduled_events_policy.scheduled_events_additional_publishing_targets.\
                event_grid_and_resource_graph = EventGridAndResourceGraph()
            vmss.scheduled_events_policy.user_initiated_reboot = UserInitiatedReboot()
            vmss.scheduled_events_policy.user_initiated_redeploy = UserInitiatedRedeploy()
        vmss.scheduled_events_policy.scheduled_events_additional_publishing_targets.\
            event_grid_and_resource_graph.enable = additional_scheduled_events
        vmss.scheduled_events_policy.user_initiated_redeploy.automatically_approve = \
            enable_user_redeploy_scheduled_events
        vmss.scheduled_events_policy.user_initiated_reboot.automatically_approve = enable_user_reboot_scheduled_events

    if enable_osimage_notification is not None:
        if vmss.virtual_machine_profile.scheduled_events_profile is None:
            vmss.virtual_machine_profile.scheduled_events_profile = cmd.get_models('ScheduledEventsProfile')()
        OSImageNotificationProfile = cmd.get_models('OSImageNotificationProfile')
        vmss.virtual_machine_profile.scheduled_events_profile.os_image_notification_profile = \
            OSImageNotificationProfile(enable=enable_osimage_notification)
    if enable_automatic_repairs is not None or \
            automatic_repairs_grace_period is not None or automatic_repairs_action is not None:
        AutomaticRepairsPolicy = cmd.get_models('AutomaticRepairsPolicy')
        vmss.automatic_repairs_policy = \
            AutomaticRepairsPolicy(enabled=enable_automatic_repairs,
                                   grace_period=automatic_repairs_grace_period,
                                   repair_action=automatic_repairs_action)

    if ultra_ssd_enabled is not None:
        if cmd.supported_api_version(min_api='2019-03-01', operation_group='virtual_machine_scale_sets'):
            if vmss.additional_capabilities is None:
                AdditionalCapabilities = cmd.get_models('AdditionalCapabilities')
                vmss.additional_capabilities = AdditionalCapabilities(ultra_ssd_enabled=ultra_ssd_enabled)
            else:
                vmss.additional_capabilities.ultra_ssd_enabled = ultra_ssd_enabled
        else:
            if vmss.virtual_machine_profile.additional_capabilities is None:
                AdditionalCapabilities = cmd.get_models('AdditionalCapabilities')
                vmss.virtual_machine_profile.additional_capabilities = AdditionalCapabilities(
                    ultra_ssd_enabled=ultra_ssd_enabled)
            else:
                vmss.virtual_machine_profile.additional_capabilities.ultra_ssd_enabled = ultra_ssd_enabled

    if scale_in_policy is not None or force_deletion is not None:
        ScaleInPolicy = cmd.get_models('ScaleInPolicy')
        vmss.scale_in_policy = ScaleInPolicy(rules=scale_in_policy, force_deletion=force_deletion)

    if enable_spot_restore is not None:
        vmss.spot_restore_policy.enabled = enable_spot_restore

    if spot_restore_timeout is not None:
        vmss.spot_restore_policy.restore_timeout = spot_restore_timeout

    if priority is not None:
        vmss.virtual_machine_profile.priority = priority

    if max_price is not None:
        if vmss.virtual_machine_profile.billing_profile is None:
            BillingProfile = cmd.get_models('BillingProfile')
            vmss.virtual_machine_profile.billing_profile = BillingProfile(max_price=max_price)
        else:
            vmss.virtual_machine_profile.billing_profile.max_price = max_price

    if security_type is not None or enable_secure_boot is not None or enable_vtpm is not None:
        security_profile = vmss.virtual_machine_profile.security_profile
        prev_security_type = security_profile.security_type if security_profile else None
        # At present, `SecurityType` has options `TrustedLaunch` and `Standard`
        if security_type == 'TrustedLaunch' and prev_security_type != security_type:
            vmss.virtual_machine_profile.security_profile = {
                'securityType': security_type,
                'uefiSettings': {
                    'secureBootEnabled': enable_secure_boot if enable_secure_boot is not None else False,
                    'vTpmEnabled': enable_vtpm if enable_vtpm is not None else True
                }
            }
        elif security_type == 'Standard':
            if prev_security_type == 'TrustedLaunch':
                logger.warning('Turning off Trusted launch disables foundational security for your VMs. '
                               'For more information, visit https://aka.ms/TrustedLaunch')
            vmss.virtual_machine_profile.security_profile = {
                'securityType': security_type,
                'uefiSettings': None
            }
        else:
            vmss.virtual_machine_profile.security_profile = {'uefiSettings': {
                'secureBootEnabled': enable_secure_boot,
                'vTpmEnabled': enable_vtpm
            }}

    if enable_proxy_agent is not None or wire_server_mode is not None or imds_mode is not None or \
            wire_server_access_control_profile_reference_id is not None or \
            imds_access_control_profile_reference_id is not None:
        SecurityProfile = cmd.get_models('SecurityProfile')
        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 vmss.virtual_machine_profile.security_profile is None:
            vmss.virtual_machine_profile.security_profile = SecurityProfile()
            vmss.virtual_machine_profile.security_profile.proxy_agent_settings = ProxyAgentSettings(
                enabled=enable_proxy_agent, wire_server=wire_server, imds=imds)
        elif vmss.virtual_machine_profile.security_profile.proxy_agent_settings is None:
            vmss.virtual_machine_profile.security_profile.proxy_agent_settings = ProxyAgentSettings(
                enabled=enable_proxy_agent, wire_server=wire_server, imds=imds)
        else:
            vmss.virtual_machine_profile.security_profile.proxy_agent_settings.enabled = enable_proxy_agent
            vmss.virtual_machine_profile.security_profile.proxy_agent_settings.wire_server.mode = wire_server_mode
            vmss.virtual_machine_profile.security_profile.proxy_agent_settings.wire_server. \
                in_vm_access_control_profile_reference_id = wire_server_access_control_profile_reference_id
            vmss.virtual_machine_profile.security_profile.proxy_agent_settings.imds.mode = imds_mode
            vmss.virtual_machine_profile.security_profile.proxy_agent_settings.imds. \
                in_vm_access_control_profile_reference_id = imds_access_control_profile_reference_id

    if regular_priority_count is not None or regular_priority_percentage is not None:
        if vmss.orchestration_mode != 'Flexible':
            raise ValidationError("--regular-priority-count/--regular-priority-percentage is only available for"
                                  " VMSS with flexible orchestration mode")
        if vmss.priority_mix_policy is None:
            vmss.priority_mix_policy = {
                'baseRegularPriorityCount': regular_priority_count,
                'regularPriorityPercentageAboveBase': regular_priority_percentage
            }
        else:
            if regular_priority_count is not None:
                vmss.priority_mix_policy.base_regular_priority_count = regular_priority_count
            if regular_priority_percentage is not None:
                vmss.priority_mix_policy.regular_priority_percentage_above_base = regular_priority_percentage

    if proximity_placement_group is not None:
        vmss.proximity_placement_group = {'id': proximity_placement_group}

    if max_batch_instance_percent is not None or max_unhealthy_instance_percent is not None \
            or max_unhealthy_upgraded_instance_percent is not None or pause_time_between_batches is not None \
            or enable_cross_zone_upgrade is not None or prioritize_unhealthy_instances is not None \
            or max_surge is not None:
        if vmss.upgrade_policy is None:
            vmss.upgrade_policy = {'rolling_upgrade_policy': None}
        if vmss.upgrade_policy.rolling_upgrade_policy is None:
            vmss.upgrade_policy.rolling_upgrade_policy = {
                'maxBatchInstancePercent': max_batch_instance_percent,
                'maxUnhealthyInstancePercent': max_unhealthy_instance_percent,
                'maxUnhealthyUpgradedInstancePercent': max_unhealthy_upgraded_instance_percent,
                'pauseTimeBetweenBatches': pause_time_between_batches,
                'enableCrossZoneUpgrade': enable_cross_zone_upgrade,
                'prioritizeUnhealthyInstances': prioritize_unhealthy_instances,
                'maxSurge': max_surge
            }
        else:
            vmss.upgrade_policy.rolling_upgrade_policy.max_batch_instance_percent = max_batch_instance_percent
            vmss.upgrade_policy.rolling_upgrade_policy.max_unhealthy_instance_percent = max_unhealthy_instance_percent
            vmss.upgrade_policy.rolling_upgrade_policy.max_unhealthy_upgraded_instance_percent = \
                max_unhealthy_upgraded_instance_percent
            vmss.upgrade_policy.rolling_upgrade_policy.pause_time_between_batches = pause_time_between_batches
            vmss.upgrade_policy.rolling_upgrade_policy.enable_cross_zone_upgrade = enable_cross_zone_upgrade
            vmss.upgrade_policy.rolling_upgrade_policy.prioritize_unhealthy_instances = prioritize_unhealthy_instances
            vmss.upgrade_policy.rolling_upgrade_policy.max_surge = max_surge

    if upgrade_policy_mode is not None:
        vmss.upgrade_policy.mode = upgrade_policy_mode

    if enable_auto_os_upgrade is not None:
        if vmss.upgrade_policy.automatic_os_upgrade_policy is None:
            vmss.upgrade_policy.automatic_os_upgrade_policy = {'enableAutomaticOSUpgrade': enable_auto_os_upgrade}
        else:
            vmss.upgrade_policy.automatic_os_upgrade_policy.enable_automatic_os_upgrade = enable_auto_os_upgrade

    if vm_sku is not None:
        if vmss.sku.name == vm_sku:
            logger.warning("VMSS sku is already %s", vm_sku)
        else:
            vmss.sku.name = vm_sku

    sku_profile = {}
    if skuprofile_vmsizes is not None or skuprofile_allostrat is not None:
        if skuprofile_vmsizes is not None:
            sku_profile_vmsizes_list = []
            for vm_size in skuprofile_vmsizes:
                vmsize_obj = {
                    'name': vm_size
                }
                sku_profile_vmsizes_list.append(vmsize_obj)
            sku_profile['vmSizes'] = sku_profile_vmsizes_list
        if skuprofile_allostrat is not None:
            sku_profile['allocationStrategy'] = skuprofile_allostrat
        vmss.sku_profile = sku_profile

    if ephemeral_os_disk_placement is not None or ephemeral_os_disk_option is not None:
        if vmss.virtual_machine_profile.storage_profile.os_disk.diff_disk_settings is not None:
            vmss.virtual_machine_profile.storage_profile.os_disk.diff_disk_settings.placement = \
                ephemeral_os_disk_placement
            vmss.virtual_machine_profile.storage_profile.os_disk.diff_disk_settings.option = \
                ephemeral_os_disk_option
        else:
            DiffDiskSettings = cmd.get_models('DiffDiskSettings')
            vmss.virtual_machine_profile.storage_profile.os_disk.diff_disk_settings = DiffDiskSettings(
                option=ephemeral_os_disk_option, placement=ephemeral_os_disk_placement)

    if ephemeral_os_disk is False:
        vmss.virtual_machine_profile.storage_profile.os_disk.diff_disk_settings = {}

    if disk_controller_type is not None:
        vmss.virtual_machine_profile.storage_profile.disk_controller_type = disk_controller_type

    if custom_data is not None:
        custom_data = read_content_if_is_file(custom_data)
        vmss.virtual_machine_profile.os_profile.custom_data = b64encode(custom_data)

    if enable_hibernation is not None:
        if vmss.additional_capabilities is None:
            AdditionalCapabilities = cmd.get_models('AdditionalCapabilities')
            vmss.additional_capabilities = AdditionalCapabilities(hibernation_enabled=enable_hibernation)
        else:
            vmss.additional_capabilities.hibernation_enabled = enable_hibernation

    if security_posture_reference_id is not None or security_posture_reference_exclude_extensions is not None or \
            security_posture_reference_is_overridable is not None:
        security_posture_reference = vmss.virtual_machine_profile.security_posture_reference
        if security_posture_reference is None:
            SecurityPostureReference = cmd.get_models('SecurityPostureReference')
            security_posture_reference = SecurityPostureReference()

        if security_posture_reference_id is not None:
            security_posture_reference.id = security_posture_reference_id
        if security_posture_reference_exclude_extensions is not None:
            security_posture_reference.exclude_extensions = security_posture_reference_exclude_extensions
        if security_posture_reference_is_overridable is not None:
            security_posture_reference.is_overridable = security_posture_reference_is_overridable

        vmss.virtual_machine_profile.security_posture_reference = security_posture_reference

    if enable_resilient_creation is not None or enable_resilient_deletion is not None:
        resiliency_policy = vmss.resiliency_policy
        if enable_resilient_creation is not None:
            resiliency_policy.resilient_vm_creation_policy = {'enabled': enable_resilient_creation}
        if enable_resilient_deletion is not None:
            resiliency_policy.resilient_vm_deletion_policy = {'enabled': enable_resilient_deletion}

    if enable_automatic_zone_balancing is not None or automatic_zone_balancing_strategy is not None or \
            automatic_zone_balancing_behavior is not None:
        resiliency_policy = vmss.resiliency_policy
        if resiliency_policy is None:
            ResiliencyPolicy = cmd.get_models('ResiliencyPolicy')
            AutomaticZoneRebalancingPolicy = cmd.get_models('AutomaticZoneRebalancingPolicy')
            resiliency_policy = ResiliencyPolicy()
            resiliency_policy.automatic_zone_rebalancing_policy = AutomaticZoneRebalancingPolicy()
        elif resiliency_policy.automatic_zone_rebalancing_policy is None:
            AutomaticZoneRebalancingPolicy = cmd.get_models('AutomaticZoneRebalancingPolicy')
            resiliency_policy.automatic_zone_rebalancing_policy = AutomaticZoneRebalancingPolicy()

        if enable_automatic_zone_balancing is not None:
            resiliency_policy.automatic_zone_rebalancing_policy.enabled = enable_automatic_zone_balancing

        if automatic_zone_balancing_strategy is not None:
            resiliency_policy.automatic_zone_rebalancing_policy.rebalance_strategy = automatic_zone_balancing_strategy

        if automatic_zone_balancing_behavior is not None:
            resiliency_policy.automatic_zone_rebalancing_policy.rebalance_behavior = automatic_zone_balancing_behavior
        vmss.resiliency_policy = resiliency_policy

    if zones is not None:
        vmss.zones = zones

    if zone_balance is not None:
        vmss.zone_balance = zone_balance

    return sdk_no_wait(no_wait, client.virtual_machine_scale_sets.begin_create_or_update,
                       resource_group_name, name, **kwargs)