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); } }