internal void HandleExternalIdentities(VirtualMachineUpdateInner vmUpdate)
        {
            if (this.HandleRemoveAllExternalIdentitiesCase(vmUpdate))
            {
                return;
            }
            else
            {
                // At this point one of the following condition is met:
                //
                // 1. User don't want touch the 'VM.Identity.UserAssignedIdentities' property
                //      [this.userAssignedIdentities.Empty() == true]
                // 2. User want to add some identities to 'VM.Identity.UserAssignedIdentities'
                //      [this.userAssignedIdentities.Empty() == false and this.virtualMachine.Inner().Identity() != null]
                // 3. User want to remove some (not all) identities in 'VM.Identity.UserAssignedIdentities'
                //      [this.userAssignedIdentities.Empty() == false and this.virtualMachine.Inner().Identity() != null]
                //      Note: The scenario where this.virtualMachine.Inner().Identity() is null in #3 is already handled in
                //      handleRemoveAllExternalIdentitiesCase method
                // 4. User want to add and remove (all or subset) some identities in 'VM.Identity.UserAssignedIdentities'
                //      [this.userAssignedIdentities.Empty() == false and this.virtualMachine.Inner().Identity() != null]
                //
                var currentIdentity = this.virtualMachine.Inner.Identity;
                vmUpdate.Identity = currentIdentity;

                if (this.userAssignedIdentities.Any())
                {
                    // At this point its guaranteed that 'currentIdentity' is not null so vmUpdate.Identity() is.
                    vmUpdate.Identity.UserAssignedIdentities = this.userAssignedIdentities;
                }
                else
                {
                    // User don't want to touch 'VM.Identity.UserAssignedIdentities' property
                    if (currentIdentity != null)
                    {
                        // and currently there is identity exists or user want to manipulate some other properties of
                        // identity, set identities to null so that it won't send over wire.
                        currentIdentity.UserAssignedIdentities = null;
                    }
                }
            }
        }
        /// <summary>
        /// Method that handle the case where user request indicates all it want to do is remove all identities associated
        /// with the virtual machine.
        /// </summary>
        /// <param name="vmUpdate">The vm update payload model.</param>
        /// <return>True if user indented to remove all the identities.</return>
        private bool HandleRemoveAllExternalIdentitiesCase(VirtualMachineUpdateInner vmUpdate)
        {
            if (this.userAssignedIdentities.Any())
            {
                int rmCount = 0;
                foreach (var v in this.userAssignedIdentities.Values)
                {
                    if (v == null)
                    {
                        rmCount++;
                    }
                    else
                    {
                        break;
                    }
                }

                var containsRemoveOnly = rmCount > 0 && rmCount == this.userAssignedIdentities.Count;
                // Check if user request contains only request for removal of identities.
                if (containsRemoveOnly)
                {
                    var currentIds      = new HashSet <string>();
                    var currentIdentity = this.virtualMachine.Inner.Identity;
                    if (currentIdentity != null && currentIdentity.UserAssignedIdentities != null)
                    {
                        foreach (var id in currentIdentity.UserAssignedIdentities.Keys)
                        {
                            currentIds.Add(id.ToLower());
                        }
                    }

                    var removeIds = new HashSet <string>();

                    foreach (var entrySet in this.userAssignedIdentities)
                    {
                        if (entrySet.Value == null)
                        {
                            removeIds.Add(entrySet.Key.ToLower());
                        }
                    }
                    // If so check user want to remove all the identities
                    var removeAllCurrentIds = currentIds.Count == removeIds.Count && !removeIds.Any(id => !currentIds.Contains(id)); // Java part looks like this -> && currentIds.ContainsAll(removeIds);
                    if (removeAllCurrentIds)
                    {
                        // If so adjust  the identity type [Setting type to SYSTEM_ASSIGNED orNONE will remove all the identities]
                        if (currentIdentity == null || currentIdentity.Type == null)
                        {
                            vmUpdate.Identity = new VirtualMachineIdentity {
                                Type = Models.ResourceIdentityType.None
                            };
                        }
                        else if (currentIdentity.Type.Equals(Models.ResourceIdentityType.SystemAssignedUserAssigned))
                        {
                            vmUpdate.Identity      = currentIdentity;
                            vmUpdate.Identity.Type = Models.ResourceIdentityType.SystemAssigned;
                        }
                        else if (currentIdentity.Type.Equals(Models.ResourceIdentityType.UserAssigned))
                        {
                            vmUpdate.Identity      = currentIdentity;
                            vmUpdate.Identity.Type = Models.ResourceIdentityType.None;
                        }
                        // and set identities property in the payload model to null so that it won't be sent
                        vmUpdate.Identity.UserAssignedIdentities = null;
                        return(true);
                    }
                    else
                    {
                        // Check user is asking to remove identities though there is no identities currently associated
                        if (currentIds.Count == 0 &&
                            removeIds.Count != 0 &&
                            currentIdentity == null)
                        {
                            // If so we are in a invalid state but we want to send user input to service and let service
                            // handle it (ignore or error).
                            vmUpdate.Identity = new VirtualMachineIdentity {
                                Type = Models.ResourceIdentityType.None
                            };
                            vmUpdate.Identity.UserAssignedIdentities = null;
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
 /// <summary>
 /// The operation to update a virtual machine.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group.
 /// </param>
 /// <param name='vmName'>
 /// The name of the virtual machine.
 /// </param>
 /// <param name='parameters'>
 /// Parameters supplied to the Update Virtual Machine operation.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <VirtualMachineInner> UpdateAsync(this IVirtualMachinesOperations operations, string resourceGroupName, string vmName, VirtualMachineUpdateInner parameters, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.UpdateWithHttpMessagesAsync(resourceGroupName, vmName, parameters, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }