/// <summary> /// Initializes a new instance of the<see cref="ASRAzureToAzureSpecificRPIDetails" /> class. /// </summary> public ASRAzureToAzureSpecificRPIDetails(A2AReplicationDetails details) { this.FabricObjectId = details.FabricObjectId; this.MultiVmGroupId = details.MultiVmGroupId; this.MultiVmGroupName = details.MultiVmGroupName; this.OSType = details.OsType; this.PrimaryFabricLocation = details.PrimaryFabricLocation; this.RecoveryFabricObjectId = details.RecoveryFabricObjectId; this.RecoveryAzureResourceGroupId = details.RecoveryAzureResourceGroupId; this.RecoveryAzureCloudService = details.RecoveryCloudService; this.RecoveryFabricLocation = details.RecoveryFabricLocation; this.RecoveryAvailabilitySet = details.RecoveryAvailabilitySet; this.TestFailoverRecoveryFabricObjectId = details.TestFailoverRecoveryFabricObjectId; this.MonitoringJobType = details.MonitoringJobType; this.MonitoringPercentageCompletion = details.MonitoringPercentageCompletion; this.AgentVersion = details.AgentVersion; this.LastRpoCalculatedTime = details.LastRpoCalculatedTime; this.RpoInSeconds = details.RpoInSeconds; this.IsReplicationAgentUpdateRequired = details.IsReplicationAgentUpdateRequired; if (details.LastHeartbeat != null) { this.LastHeartbeat = details.LastHeartbeat.Value.ToLocalTime(); } if (details.ProtectedDisks != null) { this.A2ADiskDetails = details.ProtectedDisks.ToList() .ConvertAll(disk => new ASRAzureToAzureProtectedDiskDetails(disk)); } if (details.ProtectedManagedDisks != null) { this.A2ADiskDetails = details.ProtectedManagedDisks.ToList() .ConvertAll(disk => new ASRAzureToAzureProtectedDiskDetails(disk)); } if (details.VmSyncedConfigDetails != null) { this.VmSyncedConfigDetails = new ASRAzureToAzureVmSyncedConfigDetails(details.VmSyncedConfigDetails); } }
/// <summary> /// Creates Replication Plan /// </summary> private void CreateRecoveryPlan() { var createRecoveryPlanInputProperties = new CreateRecoveryPlanInputProperties { FailoverDeploymentModel = (FailoverDeploymentModel)Enum.Parse( typeof(FailoverDeploymentModel), this.failoverDeploymentModel), Groups = new List <RecoveryPlanGroup>(), PrimaryFabricId = this.primaryserver, RecoveryFabricId = this.recoveryserver }; var recoveryPlanGroup = new RecoveryPlanGroup { GroupType = RecoveryPlanGroupType.Boot, ReplicationProtectedItems = new List <RecoveryPlanProtectedItem>(), StartGroupActions = new List <RecoveryPlanAction>(), EndGroupActions = new List <RecoveryPlanAction>() }; foreach (var rpi in this.ReplicationProtectedItem) { var fabricName = Utilities.GetValueFromArmId( rpi.ID, ARMResourceTypeConstants.ReplicationFabrics); var replicationProtectedItemResponse = this.RecoveryServicesClient .GetAzureSiteRecoveryReplicationProtectedItem( fabricName, Utilities.GetValueFromArmId( rpi.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), rpi.Name); string VmId = null; if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplicaAzureReplicationDetails)) { VmId = ((HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(HyperVReplicaReplicationDetails)) { VmId = ((HyperVReplicaReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(HyperVReplicaBlueReplicationDetails)) { VmId = ((HyperVReplicaBlueReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(InMageAzureV2ReplicationDetails)) { VmId = ((InMageAzureV2ReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(InMageReplicationDetails)) { VmId = ((InMageReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() == typeof(A2AReplicationDetails)) { A2AReplicationDetails a2aReplicationDetails = ((A2AReplicationDetails)replicationProtectedItemResponse .Properties .ProviderSpecificDetails); if (a2aReplicationDetails.FabricObjectId.IndexOf( Constants.ClassicCompute, StringComparison.OrdinalIgnoreCase) >= 0) { createRecoveryPlanInputProperties.FailoverDeploymentModel = Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.Classic; } else if (a2aReplicationDetails.FabricObjectId.IndexOf( Constants.Compute, StringComparison.OrdinalIgnoreCase) >= 0) { createRecoveryPlanInputProperties.FailoverDeploymentModel = Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager; } } var recoveryPlanProtectedItem = new RecoveryPlanProtectedItem(); recoveryPlanProtectedItem.Id = replicationProtectedItemResponse.Id; recoveryPlanProtectedItem.VirtualMachineId = VmId; recoveryPlanGroup.ReplicationProtectedItems.Add(recoveryPlanProtectedItem); } createRecoveryPlanInputProperties.Groups.Add(recoveryPlanGroup); var createRecoveryPlanInput = new CreateRecoveryPlanInput { Properties = createRecoveryPlanInputProperties }; this.CreateRecoveryPlan( this.Name, createRecoveryPlanInput); }
/// <summary> /// Creates Replication Plan /// </summary> private void CreateRecoveryPlan() { var createRecoveryPlanInputProperties = new CreateRecoveryPlanInputProperties { FailoverDeploymentModel = this.failoverDeploymentModel, Groups = new List <RecoveryPlanGroup>(), PrimaryFabricId = this.primaryserver, RecoveryFabricId = this.recoveryserver }; var recoveryPlanGroup = new RecoveryPlanGroup { GroupType = RecoveryPlanGroupType.Boot, ReplicationProtectedItems = new List <RecoveryPlanProtectedItem>(), StartGroupActions = new List <RecoveryPlanAction>(), EndGroupActions = new List <RecoveryPlanAction>() }; foreach (var rpi in this.ReplicationProtectedItem) { var fabricName = Utilities.GetValueFromArmId( rpi.ID, ARMResourceTypeConstants.ReplicationFabrics); var replicationProtectedItemResponse = this.RecoveryServicesClient .GetAzureSiteRecoveryReplicationProtectedItem( fabricName, Utilities.GetValueFromArmId( rpi.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), rpi.Name); string VmId = null; if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplicaAzureReplicationDetails)) { VmId = ((HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(HyperVReplicaReplicationDetails)) { VmId = ((HyperVReplicaReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(HyperVReplicaBlueReplicationDetails)) { VmId = ((HyperVReplicaBlueReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(InMageAzureV2ReplicationDetails)) { VmId = ((InMageAzureV2ReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(InMageReplicationDetails)) { VmId = ((InMageReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).VmId; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails.GetType() == typeof(A2AReplicationDetails)) { A2AReplicationDetails a2aReplicationDetails = ((A2AReplicationDetails)replicationProtectedItemResponse .Properties .ProviderSpecificDetails); if (a2aReplicationDetails.FabricObjectId.IndexOf( Constants.ClassicCompute, StringComparison.OrdinalIgnoreCase) >= 0) { createRecoveryPlanInputProperties.FailoverDeploymentModel = Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.Classic; } else if (a2aReplicationDetails.FabricObjectId.IndexOf( Constants.Compute, StringComparison.OrdinalIgnoreCase) >= 0) { createRecoveryPlanInputProperties.FailoverDeploymentModel = Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager; } } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(InMageRcmReplicationDetails)) { VmId = ((InMageRcmReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).InternalIdentifier; createRecoveryPlanInputProperties.FailoverDeploymentModel = Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager; } else if (replicationProtectedItemResponse.Properties.ProviderSpecificDetails .GetType() == typeof(InMageRcmFailbackReplicationDetails)) { VmId = ((InMageRcmFailbackReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails).InternalIdentifier; createRecoveryPlanInputProperties.FailoverDeploymentModel = Management.RecoveryServices.SiteRecovery.Models.FailoverDeploymentModel.ResourceManager; } var recoveryPlanProtectedItem = new RecoveryPlanProtectedItem(); recoveryPlanProtectedItem.Id = replicationProtectedItemResponse.Id; recoveryPlanProtectedItem.VirtualMachineId = VmId; recoveryPlanGroup.ReplicationProtectedItems.Add(recoveryPlanProtectedItem); } createRecoveryPlanInputProperties.Groups.Add(recoveryPlanGroup); // Add zone to zone details. if (this.ParameterSetName == ASRParameterSets.AzureZoneToZone) { var recoveryPlanA2AInput = new RecoveryPlanA2AInput { PrimaryZone = this.PrimaryZone, RecoveryZone = this.RecoveryZone, PrimaryExtendedLocation = this.IsParameterBound(c => c.PrimaryEdgeZone) ? new ExtendedLocation { Name = this.PrimaryEdgeZone } : null, RecoveryExtendedLocation = this.IsParameterBound(c => c.RecoveryEdgeZone) ? new ExtendedLocation { Name = this.RecoveryEdgeZone } : null }; createRecoveryPlanInputProperties.ProviderSpecificInput = new List <RecoveryPlanProviderSpecificInput>(); createRecoveryPlanInputProperties.ProviderSpecificInput.Add(recoveryPlanA2AInput); } var createRecoveryPlanInput = new CreateRecoveryPlanInput { Properties = createRecoveryPlanInputProperties }; this.CreateRecoveryPlan( this.Name, createRecoveryPlanInput); }
/// <summary> /// ProcessRecord of the command. /// </summary> public override void ExecuteSiteRecoveryCmdlet() { base.ExecuteSiteRecoveryCmdlet(); if (this.ShouldProcess( this.InputObject.FriendlyName, VerbsCommon.Set)) { var replicationProtectedItemResponse = this.RecoveryServicesClient .GetAzureSiteRecoveryReplicationProtectedItem( Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.InputObject.Name); var provider = replicationProtectedItemResponse.Properties.ProviderSpecificDetails; // Check for Replication Provider type HyperVReplicaAzure/InMageAzureV2 if (!(provider is HyperVReplicaAzureReplicationDetails) && !(provider is InMageAzureV2ReplicationDetails) && !(provider is A2AReplicationDetails)) { this.WriteWarning( Resources.UnsupportedReplicationProvidedForUpdateVmProperties); return; } // Check for at least one option if (string.IsNullOrEmpty(this.Name) && string.IsNullOrEmpty(this.Size) && string.IsNullOrEmpty(this.PrimaryNic) && string.IsNullOrEmpty(this.RecoveryNetworkId) && this.UseManagedDisk == null && string.IsNullOrEmpty(this.RecoveryAvailabilitySet) && string.IsNullOrEmpty(this.RecoveryCloudServiceId) && string.IsNullOrEmpty(this.RecoveryResourceGroupId) && string.IsNullOrEmpty(this.LicenseType)) { this.WriteWarning(Resources.ArgumentsMissingForUpdateVmProperties); return; } // Both primary & recovery inputs should be present if (string.IsNullOrEmpty(this.PrimaryNic) ^ string.IsNullOrEmpty(this.RecoveryNetworkId)) { this.WriteWarning(Resources.NetworkArgumentsMissingForUpdateVmProperties); return; } var vmName = this.Name; var vmSize = this.Size; var vmRecoveryNetworkId = this.RecoveryNetworkId; var licenseType = this.LicenseType; var recoveryResourceGroupId = this.RecoveryResourceGroupId; var recoveryCloudServiceId = this.RecoveryCloudServiceId; var useManagedDisk = this.UseManagedDisk; var availabilitySetId = this.RecoveryAvailabilitySet; var vMNicInputDetailsList = new List <VMNicInputDetails>(); var providerSpecificInput = new UpdateReplicationProtectedItemProviderInput(); if (provider is HyperVReplicaAzureReplicationDetails) { var providerSpecificDetails = (HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails; if (string.IsNullOrEmpty(this.Name)) { vmName = providerSpecificDetails.RecoveryAzureVMName; } if (string.IsNullOrEmpty(this.Size)) { vmSize = providerSpecificDetails.RecoveryAzureVMSize; } if (string.IsNullOrEmpty(this.RecoveryNetworkId)) { vmRecoveryNetworkId = providerSpecificDetails .SelectedRecoveryAzureNetworkId; } if (string.IsNullOrEmpty(this.LicenseType)) { licenseType = providerSpecificDetails.LicenseType; } if (string.IsNullOrEmpty(this.RecoveryAvailabilitySet)) { availabilitySetId = providerSpecificDetails.RecoveryAvailabilitySetId; } if (string.IsNullOrEmpty(this.UseManagedDisk)) { useManagedDisk = providerSpecificDetails.UseManagedDisks; } if (string.IsNullOrEmpty(this.RecoveryResourceGroupId)) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } var deploymentType = Utilities.GetValueFromArmId( providerSpecificDetails.RecoveryAzureStorageAccount, ARMResourceTypeConstants.Providers); if (deploymentType.ToLower() .Contains(Constants.Classic.ToLower())) { providerSpecificInput = new HyperVReplicaAzureUpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = recoveryResourceGroupId, RecoveryAzureV2ResourceGroupId = null }; } else { providerSpecificInput = new HyperVReplicaAzureUpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = null, RecoveryAzureV2ResourceGroupId = recoveryResourceGroupId, UseManagedDisks = useManagedDisk }; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } else if (provider is InMageAzureV2ReplicationDetails) { var providerSpecificDetails = (InMageAzureV2ReplicationDetails)replicationProtectedItemResponse.Properties .ProviderSpecificDetails; if (string.IsNullOrEmpty(this.Name)) { vmName = providerSpecificDetails.RecoveryAzureVMName; } if (string.IsNullOrEmpty(this.Size)) { vmSize = providerSpecificDetails.RecoveryAzureVMSize; } if (string.IsNullOrEmpty(this.RecoveryNetworkId)) { vmRecoveryNetworkId = providerSpecificDetails .SelectedRecoveryAzureNetworkId; } if (string.IsNullOrEmpty(this.LicenseType)) { licenseType = providerSpecificDetails.LicenseType; } if (string.IsNullOrEmpty(this.RecoveryAvailabilitySet)) { availabilitySetId = providerSpecificDetails.RecoveryAvailabilitySetId; } if (string.IsNullOrEmpty(this.UseManagedDisk)) { useManagedDisk = providerSpecificDetails.UseManagedDisks; } if (string.IsNullOrEmpty(this.RecoveryResourceGroupId)) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } var deploymentType = Utilities.GetValueFromArmId( providerSpecificDetails.RecoveryAzureStorageAccount, ARMResourceTypeConstants.Providers); if (deploymentType.ToLower() .Contains(Constants.Classic.ToLower())) { providerSpecificInput = new InMageAzureV2UpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = recoveryResourceGroupId, RecoveryAzureV2ResourceGroupId = null }; } else { providerSpecificInput = new InMageAzureV2UpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = null, RecoveryAzureV2ResourceGroupId = recoveryResourceGroupId, UseManagedDisks = useManagedDisk }; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } else if (provider is A2AReplicationDetails) { A2AReplicationDetails providerSpecificDetails = (A2AReplicationDetails)replicationProtectedItemResponse.Properties.ProviderSpecificDetails; if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryResourceGroupId))) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryCloudServiceId))) { recoveryCloudServiceId = providerSpecificDetails.RecoveryCloudService; } providerSpecificInput = new A2AUpdateReplicationProtectedItemInput() { RecoveryCloudServiceId = this.RecoveryCloudServiceId, RecoveryResourceGroupId = this.RecoveryResourceGroupId }; if (string.IsNullOrEmpty(this.RecoveryNetworkId)) { vmRecoveryNetworkId = providerSpecificDetails.SelectedRecoveryAzureNetworkId; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } var updateReplicationProtectedItemInputProperties = new UpdateReplicationProtectedItemInputProperties { RecoveryAzureVMName = vmName, RecoveryAzureVMSize = vmSize, SelectedRecoveryAzureNetworkId = vmRecoveryNetworkId, VmNics = vMNicInputDetailsList, LicenseType = licenseType == Management.RecoveryServices.SiteRecovery.Models.LicenseType .NoLicenseType.ToString() ? Management.RecoveryServices.SiteRecovery.Models.LicenseType .NoLicenseType : Management.RecoveryServices.SiteRecovery.Models.LicenseType .WindowsServer, RecoveryAvailabilitySetId = availabilitySetId, ProviderSpecificDetails = providerSpecificInput }; var input = new UpdateReplicationProtectedItemInput { Properties = updateReplicationProtectedItemInputProperties }; var response = this.RecoveryServicesClient.UpdateVmProperties( Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.InputObject.Name, input); var jobResponse = this.RecoveryServicesClient.GetAzureSiteRecoveryJobDetails( PSRecoveryServicesClient.GetJobIdFromReponseLocation(response.Location)); this.WriteObject(new ASRJob(jobResponse)); } }
/// <summary> /// ProcessRecord of the command. /// </summary> public override void ExecuteSiteRecoveryCmdlet() { base.ExecuteSiteRecoveryCmdlet(); if (this.ShouldProcess( this.InputObject.FriendlyName, VerbsCommon.Set)) { var replicationProtectedItemResponse = this.RecoveryServicesClient .GetAzureSiteRecoveryReplicationProtectedItem( Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.InputObject.Name); var provider = replicationProtectedItemResponse.Properties.ProviderSpecificDetails; // Check for Replication Provider type HyperVReplicaAzure/InMageAzureV2/A2A if (!(provider is HyperVReplicaAzureReplicationDetails) && !(provider is InMageAzureV2ReplicationDetails) && !(provider is A2AReplicationDetails)) { this.WriteWarning( Resources.UnsupportedReplicationProvidedForUpdateVmProperties); return; } // Check for at least one option if (string.IsNullOrEmpty(this.Name) && string.IsNullOrEmpty(this.Size) && string.IsNullOrEmpty(this.UpdateNic) && string.IsNullOrEmpty(this.RecoveryNetworkId) && string.IsNullOrEmpty(this.PrimaryNic) && this.UseManagedDisk == null && this.IsParameterBound(c => c.RecoveryAvailabilitySet) && this.IsParameterBound(c => c.RecoveryAvailabilityZone) && this.IsParameterBound(c => c.RecoveryProximityPlacementGroupId) && string.IsNullOrEmpty(this.RecoveryCloudServiceId) && string.IsNullOrEmpty(this.RecoveryResourceGroupId) && string.IsNullOrEmpty(this.LicenseType) && string.IsNullOrEmpty(this.RecoveryBootDiagStorageAccountId) && this.AzureToAzureUpdateReplicationConfiguration == null) { this.WriteWarning(Resources.ArgumentsMissingForUpdateVmProperties); return; } // Both primary & recovery inputs should be present if (this.ASRVMNicConfiguration == null && (string.IsNullOrEmpty(this.UpdateNic) ^ string.IsNullOrEmpty(this.RecoveryNetworkId))) { this.WriteWarning(Resources.NetworkArgumentsMissingForUpdateVmProperties); return; } // NSG, LB and PIP only for A2A provider. if ((!string.IsNullOrEmpty(RecoveryNetworkSecurityGroupId) || !string.IsNullOrEmpty(RecoveryPublicIPAddressId) || RecoveryLBBackendAddressPoolId != null && RecoveryLBBackendAddressPoolId.Length > 0) && !(provider is A2AReplicationDetails)) { this.WriteWarning( Resources.UnsupportedReplicationProvidedForNetworkingResources); return; } if (this.ASRVMNicConfiguration != null && !(provider is A2AReplicationDetails)) { this.WriteWarning(Resources.UnsupportedReplicationProvidedForASRVMNicConfig); return; } if (this.ASRVMNicConfiguration != null && !string.IsNullOrEmpty(this.UpdateNic)) { this.WriteWarning(Resources.ASRVMNicsAndUpdateNicNotAllowed); return; } var vmName = this.Name; var vmSize = this.Size; var vmRecoveryNetworkId = this.RecoveryNetworkId; var licenseType = this.LicenseType; var recoveryResourceGroupId = this.RecoveryResourceGroupId; var recoveryCloudServiceId = this.RecoveryCloudServiceId; var useManagedDisk = this.UseManagedDisk; var availabilitySetId = this.RecoveryAvailabilitySet; var proximityPlacementGroupId = this.RecoveryProximityPlacementGroupId; var availabilityZone = this.RecoveryAvailabilityZone; var primaryNic = this.PrimaryNic; var diskIdToDiskEncryptionMap = this.DiskIdToDiskEncryptionSetMap; var tfoNetworkId = string.Empty; var vMNicInputDetailsList = new List <VMNicInputDetails>(); var providerSpecificInput = new UpdateReplicationProtectedItemProviderInput(); if (provider is HyperVReplicaAzureReplicationDetails) { var providerSpecificDetails = (HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails; if (string.IsNullOrEmpty(this.Name)) { vmName = providerSpecificDetails.RecoveryAzureVmName; } if (string.IsNullOrEmpty(this.Size)) { vmSize = providerSpecificDetails.RecoveryAzureVMSize; } if (string.IsNullOrEmpty(this.RecoveryNetworkId)) { vmRecoveryNetworkId = providerSpecificDetails .SelectedRecoveryAzureNetworkId; } if (string.IsNullOrEmpty(this.LicenseType)) { licenseType = providerSpecificDetails.LicenseType; } availabilitySetId = this.IsParameterBound(c => c.RecoveryAvailabilitySet) ? this.RecoveryAvailabilitySet : providerSpecificDetails.RecoveryAvailabilitySetId; availabilityZone = this.IsParameterBound(c => c.RecoveryAvailabilityZone) ? this.RecoveryAvailabilityZone : providerSpecificDetails.TargetAvailabilityZone; proximityPlacementGroupId = this.IsParameterBound(c => c.RecoveryProximityPlacementGroupId) ? this.RecoveryProximityPlacementGroupId : providerSpecificDetails.TargetProximityPlacementGroupId; if (string.IsNullOrEmpty(this.UseManagedDisk)) { useManagedDisk = providerSpecificDetails.UseManagedDisks; } if (string.IsNullOrEmpty(this.RecoveryResourceGroupId)) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.PrimaryNic))) { primaryNic = providerSpecificDetails.SelectedSourceNicId; } if (this.DiskIdToDiskEncryptionSetMap == null || this.DiskIdToDiskEncryptionSetMap.Count == 0) { diskIdToDiskEncryptionMap = providerSpecificDetails.AzureVmDiskDetails. ToDictionary(x => x.DiskId, x => x.DiskEncryptionSetId); } var deploymentType = Utilities.GetValueFromArmId( providerSpecificDetails.RecoveryAzureStorageAccount, ARMResourceTypeConstants.Providers); if (deploymentType.ToLower() .Contains(Constants.Classic.ToLower())) { providerSpecificInput = new HyperVReplicaAzureUpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = recoveryResourceGroupId, RecoveryAzureV2ResourceGroupId = null }; } else { providerSpecificInput = new HyperVReplicaAzureUpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = null, RecoveryAzureV2ResourceGroupId = recoveryResourceGroupId, UseManagedDisks = useManagedDisk, DiskIdToDiskEncryptionMap = this.DiskIdToDiskEncryptionSetMap, TargetAvailabilityZone = availabilityZone, TargetProximityPlacementGroupId = proximityPlacementGroupId }; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } else if (provider is InMageAzureV2ReplicationDetails) { var providerSpecificDetails = (InMageAzureV2ReplicationDetails)replicationProtectedItemResponse.Properties.ProviderSpecificDetails; if (string.IsNullOrEmpty(this.Name)) { vmName = providerSpecificDetails.RecoveryAzureVMName; } if (string.IsNullOrEmpty(this.Size)) { vmSize = providerSpecificDetails.RecoveryAzureVMSize; } if (string.IsNullOrEmpty(this.RecoveryNetworkId)) { vmRecoveryNetworkId = providerSpecificDetails.SelectedRecoveryAzureNetworkId; } if (string.IsNullOrEmpty(this.LicenseType)) { licenseType = providerSpecificDetails.LicenseType; } availabilitySetId = this.IsParameterBound(c => c.RecoveryAvailabilitySet) ? this.RecoveryAvailabilitySet : providerSpecificDetails.RecoveryAvailabilitySetId; availabilityZone = this.IsParameterBound(c => c.RecoveryAvailabilityZone) ? this.RecoveryAvailabilityZone : providerSpecificDetails.TargetAvailabilityZone; proximityPlacementGroupId = this.IsParameterBound(c => c.RecoveryProximityPlacementGroupId) ? this.RecoveryProximityPlacementGroupId : providerSpecificDetails.TargetProximityPlacementGroupId; if (string.IsNullOrEmpty(this.UseManagedDisk)) { useManagedDisk = providerSpecificDetails.UseManagedDisks; } if (string.IsNullOrEmpty(this.RecoveryResourceGroupId)) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.PrimaryNic))) { primaryNic = providerSpecificDetails.SelectedSourceNicId; } var deploymentType = Utilities.GetValueFromArmId( providerSpecificDetails.TargetVmId, ARMResourceTypeConstants.Providers); if (deploymentType.ToLower() .Contains(Constants.ClassicCompute.ToLower())) { providerSpecificInput = new InMageAzureV2UpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = recoveryResourceGroupId, RecoveryAzureV2ResourceGroupId = null }; } else { providerSpecificInput = new InMageAzureV2UpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = null, RecoveryAzureV2ResourceGroupId = recoveryResourceGroupId, UseManagedDisks = useManagedDisk, TargetAvailabilityZone = availabilityZone, TargetProximityPlacementGroupId = proximityPlacementGroupId }; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } else if (provider is A2AReplicationDetails) { A2AReplicationDetails providerSpecificDetails = (A2AReplicationDetails)replicationProtectedItemResponse.Properties.ProviderSpecificDetails; if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryResourceGroupId))) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } availabilitySetId = this.IsParameterBound(c => c.RecoveryAvailabilitySet) ? this.RecoveryAvailabilitySet : providerSpecificDetails.RecoveryAvailabilitySet; if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryNetworkId))) { vmRecoveryNetworkId = providerSpecificDetails.SelectedRecoveryAzureNetworkId; } proximityPlacementGroupId = this.IsParameterBound(c => c.RecoveryProximityPlacementGroupId) ? this.RecoveryProximityPlacementGroupId : providerSpecificDetails.RecoveryProximityPlacementGroupId; if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryCloudServiceId))) { recoveryCloudServiceId = providerSpecificDetails.RecoveryCloudService; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryBootDiagStorageAccountId))) { this.RecoveryBootDiagStorageAccountId = providerSpecificDetails.RecoveryBootDiagStorageAccountId; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.TfoAzureVMName))) { this.TfoAzureVMName = providerSpecificDetails.TfoAzureVMName; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.Name))) { vmName = providerSpecificDetails.RecoveryAzureVMName; } List <A2AVmManagedDiskUpdateDetails> managedDiskUpdateDetails = null; // ManagedDisk case if (this.AzureToAzureUpdateReplicationConfiguration == null && providerSpecificDetails.ProtectedManagedDisks != null) { managedDiskUpdateDetails = new List <A2AVmManagedDiskUpdateDetails>(); foreach (var managedDisk in providerSpecificDetails.ProtectedManagedDisks) { managedDiskUpdateDetails.Add( new A2AVmManagedDiskUpdateDetails( managedDisk.DiskId, managedDisk.RecoveryTargetDiskAccountType, managedDisk.RecoveryReplicaDiskAccountType, failoverDiskName: managedDisk.FailoverDiskName, tfoDiskName: managedDisk.TfoDiskName)); } } else if (this.AzureToAzureUpdateReplicationConfiguration != null && this.AzureToAzureUpdateReplicationConfiguration[0].IsManagedDisk) { managedDiskUpdateDetails = new List <A2AVmManagedDiskUpdateDetails>(); foreach (var managedDisk in this.AzureToAzureUpdateReplicationConfiguration) { managedDiskUpdateDetails.Add( new A2AVmManagedDiskUpdateDetails( managedDisk.DiskId, managedDisk.RecoveryTargetDiskAccountType, managedDisk.RecoveryReplicaDiskAccountType, failoverDiskName: managedDisk.FailoverDiskName, tfoDiskName: managedDisk.TfoDiskName, diskEncryptionInfo: Utilities.A2AEncryptionDetails( managedDisk.DiskEncryptionSecretUrl, managedDisk.DiskEncryptionVaultId, managedDisk.KeyEncryptionKeyUrl, managedDisk.KeyEncryptionVaultId))); } } providerSpecificInput = new A2AUpdateReplicationProtectedItemInput() { RecoveryCloudServiceId = this.RecoveryCloudServiceId, RecoveryResourceGroupId = this.RecoveryResourceGroupId, RecoveryProximityPlacementGroupId = this.RecoveryProximityPlacementGroupId, RecoveryBootDiagStorageAccountId = this.RecoveryBootDiagStorageAccountId, ManagedDiskUpdateDetails = managedDiskUpdateDetails, TfoAzureVMName = this.TfoAzureVMName, DiskEncryptionInfo = Utilities.A2AEncryptionDetails( this.DiskEncryptionSecretUrl, this.DiskEncryptionVaultId, this.KeyEncryptionKeyUrl, this.KeyEncryptionVaultId) }; if (this.ASRVMNicConfiguration != null && this.ASRVMNicConfiguration.Count() > 0) { var recoveryNetworkIds = new HashSet <string>(); var tfoNetworkIds = new HashSet <string>(); this.ASRVMNicConfiguration.ForEach( nic => { if (!string.IsNullOrEmpty(nic.RecoveryVMNetworkId)) { recoveryNetworkIds.Add(nic.RecoveryVMNetworkId); } }); this.ASRVMNicConfiguration.ForEach( nic => { if (!string.IsNullOrEmpty(nic.TfoVMNetworkId)) { tfoNetworkIds.Add(nic.TfoVMNetworkId); } }); if (recoveryNetworkIds.Count() > 1) { this.WriteWarning(Resources.RecoveryNetworkIdConflictInASRVMNics); return; } if (tfoNetworkIds.Count() > 1) { this.WriteWarning(Resources.TfoNetworkIdConflictInASRVMNics); return; } if (!string.IsNullOrEmpty(this.RecoveryNetworkId) && !string.IsNullOrEmpty(recoveryNetworkIds.FirstOrDefault()) && !this.RecoveryNetworkId.Equals( recoveryNetworkIds.First(), StringComparison.OrdinalIgnoreCase)) { this.WriteWarning(Resources.RecoveryNetworkInformationMismatch); return; } if (!string.IsNullOrEmpty(recoveryNetworkIds.FirstOrDefault())) { vmRecoveryNetworkId = recoveryNetworkIds.First(); } tfoNetworkId = tfoNetworkIds.FirstOrDefault(); } if (string.IsNullOrEmpty(tfoNetworkId)) { tfoNetworkId = providerSpecificDetails.SelectedTfoAzureNetworkId; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } var updateReplicationProtectedItemInputProperties = new UpdateReplicationProtectedItemInputProperties { RecoveryAzureVMName = vmName, RecoveryAzureVMSize = vmSize, SelectedRecoveryAzureNetworkId = vmRecoveryNetworkId, SelectedTfoAzureNetworkId = tfoNetworkId, SelectedSourceNicId = primaryNic, VmNics = vMNicInputDetailsList, LicenseType = licenseType == Management.RecoveryServices.SiteRecovery.Models.LicenseType .NoLicenseType.ToString() ? Management.RecoveryServices.SiteRecovery.Models.LicenseType .NoLicenseType : Management.RecoveryServices.SiteRecovery.Models.LicenseType .WindowsServer, RecoveryAvailabilitySetId = availabilitySetId, ProviderSpecificDetails = providerSpecificInput }; if (provider is HyperVReplicaAzureReplicationDetails || provider is InMageAzureV2ReplicationDetails) { updateReplicationProtectedItemInputProperties.SelectedSourceNicId = primaryNic; } var input = new UpdateReplicationProtectedItemInput { Properties = updateReplicationProtectedItemInputProperties }; var response = this.RecoveryServicesClient.UpdateVmProperties( Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.InputObject.Name, input); var jobResponse = this.RecoveryServicesClient.GetAzureSiteRecoveryJobDetails( PSRecoveryServicesClient.GetJobIdFromReponseLocation(response.Location)); this.WriteObject(new ASRJob(jobResponse)); } }
/// <summary> /// ProcessRecord of the command. /// </summary> public override void ExecuteSiteRecoveryCmdlet() { base.ExecuteSiteRecoveryCmdlet(); if (this.ShouldProcess( this.InputObject.FriendlyName, VerbsCommon.Set)) { var replicationProtectedItemResponse = this.RecoveryServicesClient .GetAzureSiteRecoveryReplicationProtectedItem( Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.InputObject.Name); var provider = replicationProtectedItemResponse.Properties.ProviderSpecificDetails; // Check for Replication Provider type HyperVReplicaAzure/InMageAzureV2/A2A if (!(provider is HyperVReplicaAzureReplicationDetails) && !(provider is InMageAzureV2ReplicationDetails) && !(provider is A2AReplicationDetails)) { this.WriteWarning( Resources.UnsupportedReplicationProvidedForUpdateVmProperties); return; } // Check for at least one option if (string.IsNullOrEmpty(this.Name) && string.IsNullOrEmpty(this.Size) && string.IsNullOrEmpty(this.UpdateNic) && string.IsNullOrEmpty(this.RecoveryNetworkId) && string.IsNullOrEmpty(this.PrimaryNic) && this.UseManagedDisk == null && this.IsParameterBound(c => c.RecoveryAvailabilitySet) && string.IsNullOrEmpty(this.RecoveryCloudServiceId) && string.IsNullOrEmpty(this.RecoveryResourceGroupId) && string.IsNullOrEmpty(this.LicenseType) && string.IsNullOrEmpty(this.RecoveryBootDiagStorageAccountId) && this.AzureToAzureUpdateReplicationConfiguration == null) { this.WriteWarning(Resources.ArgumentsMissingForUpdateVmProperties); return; } // Both primary & recovery inputs should be present if (string.IsNullOrEmpty(this.UpdateNic) ^ string.IsNullOrEmpty(this.RecoveryNetworkId)) { this.WriteWarning(Resources.NetworkArgumentsMissingForUpdateVmProperties); return; } // NSG, LB and PIP only for A2A provider. if ((!string.IsNullOrEmpty(RecoveryNetworkSecurityGroupId) || !string.IsNullOrEmpty(RecoveryPublicIPAddressId) || RecoveryLBBackendAddressPoolId != null && RecoveryLBBackendAddressPoolId.Length > 0) && !(provider is A2AReplicationDetails)) { this.WriteWarning(Resources.NetworkingResourcesInDRNotSupportedForClassicVms); return; } var vmName = this.Name; var vmSize = this.Size; var vmRecoveryNetworkId = this.RecoveryNetworkId; var licenseType = this.LicenseType; var recoveryResourceGroupId = this.RecoveryResourceGroupId; var recoveryCloudServiceId = this.RecoveryCloudServiceId; var useManagedDisk = this.UseManagedDisk; var availabilitySetId = this.RecoveryAvailabilitySet; var primaryNic = this.PrimaryNic; var vMNicInputDetailsList = new List <VMNicInputDetails>(); var providerSpecificInput = new UpdateReplicationProtectedItemProviderInput(); if (provider is HyperVReplicaAzureReplicationDetails) { var providerSpecificDetails = (HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse .Properties.ProviderSpecificDetails; if (string.IsNullOrEmpty(this.Name)) { vmName = providerSpecificDetails.RecoveryAzureVmName; } if (string.IsNullOrEmpty(this.Size)) { vmSize = providerSpecificDetails.RecoveryAzureVMSize; } if (string.IsNullOrEmpty(this.RecoveryNetworkId)) { vmRecoveryNetworkId = providerSpecificDetails .SelectedRecoveryAzureNetworkId; } if (string.IsNullOrEmpty(this.LicenseType)) { licenseType = providerSpecificDetails.LicenseType; } availabilitySetId = this.IsParameterBound(c => c.RecoveryAvailabilitySet) ? this.RecoveryAvailabilitySet : providerSpecificDetails.RecoveryAvailabilitySetId; if (string.IsNullOrEmpty(this.UseManagedDisk)) { useManagedDisk = providerSpecificDetails.UseManagedDisks; } if (string.IsNullOrEmpty(this.RecoveryResourceGroupId)) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.PrimaryNic))) { primaryNic = providerSpecificDetails.SelectedSourceNicId; } var deploymentType = Utilities.GetValueFromArmId( providerSpecificDetails.RecoveryAzureStorageAccount, ARMResourceTypeConstants.Providers); if (deploymentType.ToLower() .Contains(Constants.Classic.ToLower())) { providerSpecificInput = new HyperVReplicaAzureUpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = recoveryResourceGroupId, RecoveryAzureV2ResourceGroupId = null }; } else { providerSpecificInput = new HyperVReplicaAzureUpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = null, RecoveryAzureV2ResourceGroupId = recoveryResourceGroupId, UseManagedDisks = useManagedDisk }; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } else if (provider is InMageAzureV2ReplicationDetails) { var providerSpecificDetails = (InMageAzureV2ReplicationDetails)replicationProtectedItemResponse.Properties.ProviderSpecificDetails; if (string.IsNullOrEmpty(this.Name)) { vmName = providerSpecificDetails.RecoveryAzureVMName; } if (string.IsNullOrEmpty(this.Size)) { vmSize = providerSpecificDetails.RecoveryAzureVMSize; } if (string.IsNullOrEmpty(this.RecoveryNetworkId)) { vmRecoveryNetworkId = providerSpecificDetails.SelectedRecoveryAzureNetworkId; } if (string.IsNullOrEmpty(this.LicenseType)) { licenseType = providerSpecificDetails.LicenseType; } availabilitySetId = this.IsParameterBound(c => c.RecoveryAvailabilitySet) ? this.RecoveryAvailabilitySet : providerSpecificDetails.RecoveryAvailabilitySetId; if (string.IsNullOrEmpty(this.UseManagedDisk)) { useManagedDisk = providerSpecificDetails.UseManagedDisks; } if (string.IsNullOrEmpty(this.RecoveryResourceGroupId)) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.PrimaryNic))) { primaryNic = providerSpecificDetails.SelectedSourceNicId; } var deploymentType = Utilities.GetValueFromArmId( providerSpecificDetails.TargetVmId, ARMResourceTypeConstants.Providers); if (deploymentType.ToLower() .Contains(Constants.ClassicCompute.ToLower())) { providerSpecificInput = new InMageAzureV2UpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = recoveryResourceGroupId, RecoveryAzureV2ResourceGroupId = null }; } else { providerSpecificInput = new InMageAzureV2UpdateReplicationProtectedItemInput { RecoveryAzureV1ResourceGroupId = null, RecoveryAzureV2ResourceGroupId = recoveryResourceGroupId, UseManagedDisks = useManagedDisk }; } vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } else if (provider is A2AReplicationDetails) { A2AReplicationDetails providerSpecificDetails = (A2AReplicationDetails)replicationProtectedItemResponse.Properties.ProviderSpecificDetails; if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryResourceGroupId))) { recoveryResourceGroupId = providerSpecificDetails.RecoveryAzureResourceGroupId; } availabilitySetId = this.IsParameterBound(c => c.RecoveryAvailabilitySet) ? this.RecoveryAvailabilitySet : providerSpecificDetails.RecoveryAvailabilitySet; if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryNetworkId))) { vmRecoveryNetworkId = providerSpecificDetails.SelectedRecoveryAzureNetworkId; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryCloudServiceId))) { recoveryCloudServiceId = providerSpecificDetails.RecoveryCloudService; } if (!this.MyInvocation.BoundParameters.ContainsKey( Utilities.GetMemberName(() => this.RecoveryBootDiagStorageAccountId))) { this.RecoveryBootDiagStorageAccountId = providerSpecificDetails.RecoveryBootDiagStorageAccountId; } List <A2AVmManagedDiskUpdateDetails> managedDiskUpdateDetails = null; // ManagedDisk case if (this.AzureToAzureUpdateReplicationConfiguration == null && providerSpecificDetails.ProtectedManagedDisks != null) { managedDiskUpdateDetails = new List <A2AVmManagedDiskUpdateDetails>(); foreach (var managedDisk in providerSpecificDetails.ProtectedManagedDisks) { managedDiskUpdateDetails.Add( new A2AVmManagedDiskUpdateDetails( managedDisk.DiskId, managedDisk.RecoveryTargetDiskAccountType, managedDisk.RecoveryReplicaDiskAccountType)); } } else if (this.AzureToAzureUpdateReplicationConfiguration != null && this.AzureToAzureUpdateReplicationConfiguration[0].IsManagedDisk) { managedDiskUpdateDetails = new List <A2AVmManagedDiskUpdateDetails>(); foreach (var managedDisk in this.AzureToAzureUpdateReplicationConfiguration) { managedDiskUpdateDetails.Add( new A2AVmManagedDiskUpdateDetails( managedDisk.DiskId, managedDisk.RecoveryTargetDiskAccountType, managedDisk.RecoveryReplicaDiskAccountType)); } } providerSpecificInput = new A2AUpdateReplicationProtectedItemInput() { RecoveryCloudServiceId = this.RecoveryCloudServiceId, RecoveryResourceGroupId = this.RecoveryResourceGroupId, RecoveryBootDiagStorageAccountId = this.RecoveryBootDiagStorageAccountId, ManagedDiskUpdateDetails = managedDiskUpdateDetails, DiskEncryptionInfo = this.A2AEncryptionDetails(provider) }; vMNicInputDetailsList = getNicListToUpdate(providerSpecificDetails.VmNics); } var updateReplicationProtectedItemInputProperties = new UpdateReplicationProtectedItemInputProperties { RecoveryAzureVMName = vmName, RecoveryAzureVMSize = vmSize, SelectedRecoveryAzureNetworkId = vmRecoveryNetworkId, SelectedSourceNicId = primaryNic, VmNics = vMNicInputDetailsList, LicenseType = licenseType == Management.RecoveryServices.SiteRecovery.Models.LicenseType .NoLicenseType.ToString() ? Management.RecoveryServices.SiteRecovery.Models.LicenseType .NoLicenseType : Management.RecoveryServices.SiteRecovery.Models.LicenseType .WindowsServer, RecoveryAvailabilitySetId = availabilitySetId, ProviderSpecificDetails = providerSpecificInput }; if (provider is HyperVReplicaAzureReplicationDetails || provider is InMageAzureV2ReplicationDetails) { updateReplicationProtectedItemInputProperties.SelectedSourceNicId = primaryNic; } var input = new UpdateReplicationProtectedItemInput { Properties = updateReplicationProtectedItemInputProperties }; var response = this.RecoveryServicesClient.UpdateVmProperties( Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.InputObject.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.InputObject.Name, input); var jobResponse = this.RecoveryServicesClient.GetAzureSiteRecoveryJobDetails( PSRecoveryServicesClient.GetJobIdFromReponseLocation(response.Location)); this.WriteObject(new ASRJob(jobResponse)); } }