/// <summary> /// ProcessRecord of the command. /// </summary> public override void ExecuteSiteRecoveryCmdlet() { base.ExecuteSiteRecoveryCmdlet(); this.targetNameOrId = this.ProtectionEntity.FriendlyName; this.ConfirmAction( this.Force.IsPresent || 0 != string.CompareOrdinal(this.Protection, Constants.DisableProtection), string.Format(Properties.Resources.DisableProtectionWarning, this.targetNameOrId), string.Format(Properties.Resources.DisableProtectionWhatIfMessage, this.Protection), this.targetNameOrId, () => { if (this.Protection == Constants.EnableProtection) { if (string.Compare(this.ParameterSetName, ASRParameterSets.DisableDR, StringComparison.OrdinalIgnoreCase) == 0) { throw new PSArgumentException(Properties.Resources.PassingPolicyMandatoryForEnablingDR); } EnableProtectionProviderSpecificInput enableProtectionProviderSpecificInput = new EnableProtectionProviderSpecificInput(); EnableProtectionInputProperties inputProperties = new EnableProtectionInputProperties() { PolicyId = this.Policy.ID, ProtectableItemId = this.ProtectionEntity.ID, ProviderSpecificDetails = enableProtectionProviderSpecificInput }; EnableProtectionInput input = new EnableProtectionInput() { Properties = inputProperties }; // Process if block only if policy is not null, policy is created for E2A or B2A and parameter set is for enable DR of E2A or B2A if (this.Policy != null && 0 == string.Compare(this.Policy.ReplicationProvider, Constants.HyperVReplicaAzure, StringComparison.OrdinalIgnoreCase) && (0 == string.Compare(this.ParameterSetName, ASRParameterSets.EnterpriseToAzure, StringComparison.OrdinalIgnoreCase) || 0 == string.Compare(this.ParameterSetName, ASRParameterSets.HyperVSiteToAzure, StringComparison.OrdinalIgnoreCase))) { HyperVReplicaAzureEnableProtectionInput providerSettings = new HyperVReplicaAzureEnableProtectionInput(); providerSettings.HvHostVmId = this.ProtectionEntity.FabricObjectId; providerSettings.VmName = this.ProtectionEntity.FriendlyName; // Id disk details are missing in input PE object, get the latest PE. if (string.IsNullOrEmpty(this.ProtectionEntity.OS)) { // Just checked for OS to see whether the disk details got filled up or not ProtectableItemResponse protectableItemResponse = RecoveryServicesClient.GetAzureSiteRecoveryProtectableItem( Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics), this.ProtectionEntity.ProtectionContainerId, this.ProtectionEntity.Name); this.ProtectionEntity = new ASRProtectionEntity(protectableItemResponse.ProtectableItem); } if (string.IsNullOrWhiteSpace(this.OS)) { providerSettings.OSType = ((string.Compare(this.ProtectionEntity.OS, Constants.OSWindows) == 0) || (string.Compare(this.ProtectionEntity.OS, Constants.OSLinux) == 0)) ? this.ProtectionEntity.OS : Constants.OSWindows; } else { providerSettings.OSType = this.OS; } if (string.IsNullOrWhiteSpace(this.OSDiskName)) { providerSettings.VhdId = this.ProtectionEntity.OSDiskId; } else { foreach (var disk in this.ProtectionEntity.Disks) { if (0 == string.Compare(disk.Name, this.OSDiskName, true)) { providerSettings.VhdId = disk.Id; break; } } } if (RecoveryAzureStorageAccountId != null) { providerSettings.TargetStorageAccountId = RecoveryAzureStorageAccountId; } input.Properties.ProviderSpecificDetails = providerSettings; } else if (this.Policy != null && 0 == string.Compare(this.Policy.ReplicationProvider, Constants.HyperVReplicaAzure, StringComparison.OrdinalIgnoreCase) && 0 == string.Compare(this.ParameterSetName, ASRParameterSets.EnterpriseToEnterprise, StringComparison.OrdinalIgnoreCase)) { throw new PSArgumentException(Properties.Resources.PassingStorageMandatoryForEnablingDRInAzureScenarios); } this.response = RecoveryServicesClient.EnableProtection( Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.ProtectionEntity.Name, input); } else { // fetch the latest PE object ProtectableItemResponse protectableItemResponse = RecoveryServicesClient.GetAzureSiteRecoveryProtectableItem(Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics), this.ProtectionEntity.ProtectionContainerId, this.ProtectionEntity.Name); ProtectableItem protectableItem = protectableItemResponse.ProtectableItem; if (!this.Force.IsPresent) { DisableProtectionInput input = new DisableProtectionInput(); input.Properties = new DisableProtectionInputProperties() { ProviderSettings = new DisableProtectionProviderSpecificInput() }; this.response = RecoveryServicesClient.DisableProtection( Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), Utilities.GetValueFromArmId(protectableItem.Properties.ReplicationProtectedItemId, ARMResourceTypeConstants.ReplicationProtectedItems), input); } else { this.response = RecoveryServicesClient.PurgeProtection( Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), Utilities.GetValueFromArmId(protectableItem.Properties.ReplicationProtectedItemId, ARMResourceTypeConstants.ReplicationProtectedItems) ); } } jobResponse = RecoveryServicesClient .GetAzureSiteRecoveryJobDetails(PSRecoveryServicesClient.GetJobIdFromReponseLocation(response.Location)); WriteObject(new ASRJob(jobResponse.Job)); if (this.WaitForCompletion.IsPresent) { this.WaitForJobCompletion(this.jobResponse.Job.Name); jobResponse = RecoveryServicesClient .GetAzureSiteRecoveryJobDetails(PSRecoveryServicesClient.GetJobIdFromReponseLocation(response.Location)); WriteObject(new ASRJob(jobResponse.Job)); } }); }
/// <summary> /// ProcessRecord of the command. /// </summary> public override void ExecuteSiteRecoveryCmdlet() { base.ExecuteSiteRecoveryCmdlet(); if (this.ShouldProcess(this.Name, VerbsCommon.New)) { var policy = this.RecoveryServicesClient.GetAzureSiteRecoveryPolicy( Utilities.GetValueFromArmId( this.ProtectionContainerMapping.PolicyId, ARMResourceTypeConstants.ReplicationPolicies)); var policyInstanceType = policy.Properties.ProviderSpecificDetails; var enableProtectionProviderSpecificInput = new EnableProtectionProviderSpecificInput(); var inputProperties = new EnableProtectionInputProperties { PolicyId = this.ProtectionContainerMapping.PolicyId, // A2A there is no ProtectableItem ProtectableItemId = this.ProtectableItem == null ? null : this.ProtectableItem.ID, ProviderSpecificDetails = enableProtectionProviderSpecificInput }; var input = new EnableProtectionInput { Properties = inputProperties }; switch (this.ParameterSetName) { case ASRParameterSets.EnterpriseToEnterprise: if (!(policyInstanceType is HyperVReplicaPolicyDetails) && !(policyInstanceType is HyperVReplicaBluePolicyDetails)) { throw new PSArgumentException( string.Format( Resources.ContainerMappingParameterSetMismatch, this.ProtectionContainerMapping.Name, policyInstanceType)); } break; case ASRParameterSets.EnterpriseToAzure: case ASRParameterSets.HyperVSiteToAzure: if (!(policyInstanceType is HyperVReplicaAzurePolicyDetails)) { throw new PSArgumentException( string.Format( Resources.ContainerMappingParameterSetMismatch, this.ProtectionContainerMapping.Name, policyInstanceType)); } EnterpriseAndHyperVToAzure(input); break; case VMwareToAzureWithDiskType: case VMwareToAzureParameterSet: if (!(policyInstanceType is InMageAzureV2PolicyDetails)) { throw new PSArgumentException( string.Format( Resources.ContainerMappingParameterSetMismatch, this.ProtectionContainerMapping.Name, policyInstanceType)); } VMwareToAzureReplication(input); break; case ASRParameterSets.AzureToAzureWithoutDiskDetails: case ASRParameterSets.AzureToAzure: if (!(policyInstanceType is A2APolicyDetails)) { throw new PSArgumentException( string.Format( Properties.Resources.ContainerMappingParameterSetMismatch, this.ProtectionContainerMapping.Name, policyInstanceType)); } AzureToAzureReplication(input); break; default: break; } this.response = this.RecoveryServicesClient.EnableProtection( Utilities.GetValueFromArmId( this.ProtectionContainerMapping.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.ProtectionContainerMapping.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.Name, input); this.jobResponse = this.RecoveryServicesClient.GetAzureSiteRecoveryJobDetails( PSRecoveryServicesClient.GetJobIdFromReponseLocation(this.response.Location)); this.WriteObject(new ASRJob(this.jobResponse)); if (this.WaitForCompletion.IsPresent) { this.WaitForJobCompletion(this.jobResponse.Name); this.jobResponse = this.RecoveryServicesClient.GetAzureSiteRecoveryJobDetails( PSRecoveryServicesClient .GetJobIdFromReponseLocation(this.response.Location)); this.WriteObject(new ASRJob(this.jobResponse)); } } }
/// <summary> /// ProcessRecord of the command. /// </summary> public override void ExecuteSiteRecoveryCmdlet() { base.ExecuteSiteRecoveryCmdlet(); if (this.ShouldProcess( this.Name, VerbsCommon.New)) { var policy = this.RecoveryServicesClient.GetAzureSiteRecoveryPolicy( Utilities.GetValueFromArmId( this.ProtectionContainerMapping.PolicyId, ARMResourceTypeConstants.ReplicationPolicies)); var policyInstanceType = policy.Properties.ProviderSpecificDetails; switch (this.ParameterSetName) { case ASRParameterSets.EnterpriseToEnterprise: if (!(policyInstanceType is HyperVReplicaPolicyDetails) && !(policyInstanceType is HyperVReplicaBluePolicyDetails)) { throw new PSArgumentException( string.Format( Resources.ContainerMappingParameterSetMismatch, this.ProtectionContainerMapping.Name, policyInstanceType)); } break; case ASRParameterSets.EnterpriseToAzure: case ASRParameterSets.HyperVSiteToAzure: if (!(policyInstanceType is HyperVReplicaAzurePolicyDetails)) { throw new PSArgumentException( string.Format( Resources.ContainerMappingParameterSetMismatch, this.ProtectionContainerMapping.Name, policyInstanceType)); } break; default: break; } var enableProtectionProviderSpecificInput = new EnableProtectionProviderSpecificInput(); var inputProperties = new EnableProtectionInputProperties { PolicyId = this.ProtectionContainerMapping.PolicyId, ProtectableItemId = this.ProtectableItem.ID, ProviderSpecificDetails = enableProtectionProviderSpecificInput }; var input = new EnableProtectionInput { Properties = inputProperties }; // E2A and B2A. if ((0 == string.Compare( this.ParameterSetName, ASRParameterSets.EnterpriseToAzure, StringComparison.OrdinalIgnoreCase)) || (0 == string.Compare( this.ParameterSetName, ASRParameterSets.HyperVSiteToAzure, StringComparison.OrdinalIgnoreCase))) { var providerSettings = new HyperVReplicaAzureEnableProtectionInput(); providerSettings.HvHostVmId = this.ProtectableItem.FabricObjectId; providerSettings.VmName = this.ProtectableItem.FriendlyName; providerSettings.TargetAzureVmName = this.ProtectableItem.FriendlyName; // Id disk details are missing in input PE object, get the latest PE. if (string.IsNullOrEmpty(this.ProtectableItem.OS)) { // Just checked for OS to see whether the disk details got filled up or not var protectableItemResponse = this.RecoveryServicesClient .GetAzureSiteRecoveryProtectableItem( Utilities.GetValueFromArmId( this.ProtectableItem.ID, ARMResourceTypeConstants.ReplicationFabrics), this.ProtectableItem.ProtectionContainerId, this.ProtectableItem.Name); this.ProtectableItem = new ASRProtectableItem(protectableItemResponse); } if (string.IsNullOrWhiteSpace(this.OS)) { providerSettings.OsType = (string.Compare( this.ProtectableItem.OS, Constants.OSWindows, StringComparison.OrdinalIgnoreCase) == 0) || (string.Compare( this.ProtectableItem.OS, Constants.OSLinux) == 0) ? this.ProtectableItem.OS : Constants.OSWindows; } else { providerSettings.OsType = this.OS; } if (string.IsNullOrWhiteSpace(this.OSDiskName)) { providerSettings.VhdId = this.ProtectableItem.OSDiskId; } else { foreach (var disk in this.ProtectableItem.Disks) { if (0 == string.Compare( disk.Name, this.OSDiskName, true)) { providerSettings.VhdId = disk.Id; break; } } } if (this.RecoveryAzureStorageAccountId != null) { providerSettings.TargetStorageAccountId = this.RecoveryAzureStorageAccountId; } var deploymentType = Utilities.GetValueFromArmId( this.RecoveryAzureStorageAccountId, ARMResourceTypeConstants.Providers); if (deploymentType.ToLower() .Contains(Constants.Classic.ToLower())) { providerSettings.TargetAzureV1ResourceGroupId = this.RecoveryResourceGroupId; providerSettings.TargetAzureV2ResourceGroupId = null; } else { providerSettings.TargetAzureV1ResourceGroupId = null; providerSettings.TargetAzureV2ResourceGroupId = this.RecoveryResourceGroupId; } input.Properties.ProviderSpecificDetails = providerSettings; } this.response = this.RecoveryServicesClient.EnableProtection( Utilities.GetValueFromArmId( this.ProtectableItem.ID, ARMResourceTypeConstants.ReplicationFabrics), Utilities.GetValueFromArmId( this.ProtectableItem.ID, ARMResourceTypeConstants.ReplicationProtectionContainers), this.Name, input); this.jobResponse = this.RecoveryServicesClient.GetAzureSiteRecoveryJobDetails( PSRecoveryServicesClient.GetJobIdFromReponseLocation(this.response.Location)); this.WriteObject(new ASRJob(this.jobResponse)); if (this.WaitForCompletion.IsPresent) { this.WaitForJobCompletion(this.jobResponse.Name); this.jobResponse = this.RecoveryServicesClient.GetAzureSiteRecoveryJobDetails( PSRecoveryServicesClient .GetJobIdFromReponseLocation(this.response.Location)); this.WriteObject(new ASRJob(this.jobResponse)); } } }