From 61c1cfd03749f6a994d912ddeafb03e5915cd0cb Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Wed, 17 Mar 2021 07:34:16 +0530 Subject: [PATCH] fixing sql restore, breaking change --- .../RecoveryServices.Backup.Helpers.csproj | 2 +- .../AzureWorkloadRecoveryConfig.cs | 7 +++++- .../Properties/Resources.Designer.cs | 11 ++++++++ .../Properties/Resources.resx | 3 +++ .../RecoveryServices.Backup.Models.csproj | 2 +- .../AzureWorkloadProviderHelper.cs | 17 ++++++++++++- .../AzureWorkloadPsBackupProvider.cs | 25 ++++++++++++++++--- .../RecoveryServices.Backup.Providers.csproj | 2 +- .../BMSAPIs/RestoreDiskAPIs.cs | 5 ++-- .../BMSAPIs/VaultAPIs.cs | 13 ++++++++-- ...ervices.Backup.ServiceClientAdapter.csproj | 2 +- .../RecoveryServices.Backup.Test.csproj | 2 +- ...mRecoveryServicesBackupRecoveryLogChain.cs | 8 ++++++ ...eryServicesBackupWorkloadRecoveryConfig.cs | 15 +++++++---- ...estoreAzureRMRecoveryServicesBackupItem.cs | 8 +++--- .../RecoveryServices.Backup.csproj | 2 +- .../RecoveryServices.SiteRecovery.Test.csproj | 2 +- .../RecoveryServices.Test.csproj | 2 +- src/RecoveryServices/RecoveryServices.sln | 2 +- .../RecoveryServices/ChangeLog.md | 1 + .../RecoveryServices/RecoveryServices.csproj | 2 +- .../Vault/GetAzureRmRecoveryServicesVaults.cs | 1 - ...zRecoveryServicesBackupRecoveryLogChain.md | 23 ++++++++++++++--- ...eryServicesBackupWorkloadRecoveryConfig.md | 7 +++--- 24 files changed, 128 insertions(+), 36 deletions(-) diff --git a/src/RecoveryServices/RecoveryServices.Backup.Helpers/RecoveryServices.Backup.Helpers.csproj b/src/RecoveryServices/RecoveryServices.Backup.Helpers/RecoveryServices.Backup.Helpers.csproj index 5d90d8ee8ec5..919fabcc771e 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Helpers/RecoveryServices.Backup.Helpers.csproj +++ b/src/RecoveryServices/RecoveryServices.Backup.Helpers/RecoveryServices.Backup.Helpers.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.Backup.Models/AzureVmWorkloadModels/AzureWorkloadRecoveryConfig.cs b/src/RecoveryServices/RecoveryServices.Backup.Models/AzureVmWorkloadModels/AzureWorkloadRecoveryConfig.cs index 7e896acd84e7..c0122b659475 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Models/AzureVmWorkloadModels/AzureWorkloadRecoveryConfig.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.Models/AzureVmWorkloadModels/AzureWorkloadRecoveryConfig.cs @@ -38,6 +38,11 @@ public class AzureWorkloadRecoveryConfig : RecoveryConfigBase /// public string RestoredDBName { get; set; } + /// + /// Target Virtual Machine Id in case of Alternate Location Restore + /// + public string TargetVirtualMachineId { get; set; } + /// /// OverwriteWLIfpresent /// @@ -66,7 +71,7 @@ public AzureWorkloadRecoveryConfig(string targetServer, string targetInstance, s : base(restoreRequestType, recoveryPoint, pointInTime) { TargetServer = targetServer; - TargetInstance = targetInstance; + TargetInstance = targetInstance; } } } \ No newline at end of file diff --git a/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.Designer.cs b/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.Designer.cs index 98f03c006a30..9342543fc034 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.Designer.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.Designer.cs @@ -1895,5 +1895,16 @@ public static string ZonalRestoreVaultStorageRedundancyException return ResourceManager.GetString("ZonalRestoreVaultStorageRedundancyException", resourceCulture); } } + + /// + /// Looks up a localized string similar to WorkloadRecoveryConfig TargetVirtualMachineId cannot be null for Alternate location restore. + /// + public static string TargetVirtualMachineIdRequiredException + { + get + { + return ResourceManager.GetString("TargetVirtualMachineIdRequiredException", resourceCulture); + } + } } } diff --git a/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.resx b/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.resx index 24464c91f7c4..a72e6bc047a9 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.resx +++ b/src/RecoveryServices/RecoveryServices.Backup.Models/Properties/Resources.resx @@ -625,4 +625,7 @@ Please contact Microsoft for further assistance. Please check whether the vault storageRedundancy is ZRS or RA-GRS or remove TargetZone + + WorkloadRecoveryConfig TargetVirtualMachineId cannot be null for Alternate location restore + \ No newline at end of file diff --git a/src/RecoveryServices/RecoveryServices.Backup.Models/RecoveryServices.Backup.Models.csproj b/src/RecoveryServices/RecoveryServices.Backup.Models/RecoveryServices.Backup.Models.csproj index 70e32c9e21f7..d9588132187b 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Models/RecoveryServices.Backup.Models.csproj +++ b/src/RecoveryServices/RecoveryServices.Backup.Models/RecoveryServices.Backup.Models.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs b/src/RecoveryServices/RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs index 5cd588bfd656..ca0756b8645a 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs @@ -440,6 +440,7 @@ public List ListLogChains(Dictionary ProviderData DateTime startDate = (DateTime)(ProviderData[RecoveryPointParams.StartDate]); DateTime endDate = (DateTime)(ProviderData[RecoveryPointParams.EndDate]); string restorePointQueryType = (string)ProviderData[RecoveryPointParams.RestorePointQueryType]; + bool secondaryRegion = (bool)ProviderData[CRRParams.UseSecondaryRegion]; ItemBase item = ProviderData[RecoveryPointParams.Item] as ItemBase; @@ -465,12 +466,26 @@ public List ListLogChains(Dictionary ProviderData ODataQuery queryFilter = new ODataQuery(); queryFilter.Filter = queryFilterString; - List rpListResponse = ServiceClientAdapter.GetRecoveryPoints( + List rpListResponse; + if (secondaryRegion) + { + //fetch recovery points Log Chain from secondary region + rpListResponse = ServiceClientAdapter.GetRecoveryPointsFromSecondaryRegion( + containerUri, + protectedItemName, + queryFilter, + vaultName: vaultName, + resourceGroupName: resourceGroupName); + } + else + { + rpListResponse = ServiceClientAdapter.GetRecoveryPoints( containerUri, protectedItemName, queryFilter, vaultName: vaultName, resourceGroupName: resourceGroupName); + } List timeRanges = new List(); foreach (RecoveryPointResource rp in rpListResponse) diff --git a/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs b/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs index 7b8def6adf29..a16df5731145 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs @@ -104,7 +104,7 @@ public RestAzureNS.AzureOperationResponse DisableProtectionWithDeleteData() } public RestAzureNS.AzureOperationResponse UndeleteProtection() - { + { string vaultName = (string)ProviderData[VaultParams.VaultName]; string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName]; AzureWorkloadSQLDatabaseProtectedItem item = (AzureWorkloadSQLDatabaseProtectedItem)ProviderData[ItemParams.Item]; @@ -431,6 +431,15 @@ public RestAzureNS.AzureOperationResponse TriggerRestore() ContainerId = wLRecoveryConfig.ContainerId }; azureWorkloadSQLRestoreRequest.AlternateDirectoryPaths = wLRecoveryConfig.targetPhysicalPath; + + if (wLRecoveryConfig.TargetVirtualMachineId != null && wLRecoveryConfig.TargetVirtualMachineId != "") + { + azureWorkloadSQLRestoreRequest.TargetVirtualMachineId = wLRecoveryConfig.TargetVirtualMachineId; + } + else + { + throw new ArgumentException(Resources.TargetVirtualMachineIdRequiredException); + } } if (wLRecoveryConfig.RecoveryMode == "FileRecovery") { @@ -468,6 +477,15 @@ public RestAzureNS.AzureOperationResponse TriggerRestore() ContainerId = wLRecoveryConfig.ContainerId }; azureWorkloadSQLPointInTimeRestoreRequest.AlternateDirectoryPaths = wLRecoveryConfig.targetPhysicalPath; + + if (wLRecoveryConfig.TargetVirtualMachineId != null && wLRecoveryConfig.TargetVirtualMachineId != "") + { + azureWorkloadSQLPointInTimeRestoreRequest.TargetVirtualMachineId = wLRecoveryConfig.TargetVirtualMachineId; + } + else + { + throw new ArgumentException(Resources.TargetVirtualMachineIdRequiredException); + } } if (wLRecoveryConfig.RecoveryMode == "FileRecovery") @@ -491,7 +509,7 @@ public RestAzureNS.AzureOperationResponse TriggerRestore() AzureRecoveryPoint rp = (AzureRecoveryPoint)wLRecoveryConfig.RecoveryPoint; // get access token - CrrAccessToken accessToken = ServiceClientAdapter.GetCRRAccessToken(rp, secondaryRegion, vaultName: vaultName, resourceGroupName: resourceGroupName); + CrrAccessToken accessToken = ServiceClientAdapter.GetCRRAccessToken(rp, secondaryRegion, vaultName: vaultName, resourceGroupName: resourceGroupName, ServiceClientModel.BackupManagementType.AzureWorkload); // AzureWorkload CRR Request Logger.Instance.WriteDebug("Triggering Restore to secondary region: " + secondaryRegion); @@ -517,8 +535,7 @@ public RestAzureNS.AzureOperationResponse TriggerRestore() resourceGroupName: resourceGroupName, vaultLocation: vaultLocation); return response; - } - + } } private RestAzureNS.AzureOperationResponse CreateorModifyPolicy() diff --git a/src/RecoveryServices/RecoveryServices.Backup.Providers/RecoveryServices.Backup.Providers.csproj b/src/RecoveryServices/RecoveryServices.Backup.Providers/RecoveryServices.Backup.Providers.csproj index cf3128111e12..c9781b3f130f 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Providers/RecoveryServices.Backup.Providers.csproj +++ b/src/RecoveryServices/RecoveryServices.Backup.Providers/RecoveryServices.Backup.Providers.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/RestoreDiskAPIs.cs b/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/RestoreDiskAPIs.cs index fe4735cf9214..32064fa36aa7 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/RestoreDiskAPIs.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/RestoreDiskAPIs.cs @@ -78,14 +78,15 @@ public CrrAccessToken GetCRRAccessToken( AzureRecoveryPoint rp, string secondaryRegion, string vaultName = null, - string resourceGroupName = null) + string resourceGroupName = null, + string backupManagementType = null) { Dictionary uriDict = HelperUtils.ParseUri(rp.Id); string containerUri = HelperUtils.GetContainerUri(uriDict, rp.Id); string protectedItemUri = HelperUtils.GetProtectedItemUri(uriDict, rp.Id); string recoveryPointId = rp.RecoveryPointId; - AADPropertiesResource userInfo = GetAADProperties(secondaryRegion); + AADPropertiesResource userInfo = GetAADProperties(secondaryRegion, backupManagementType); var accessToken = BmsAdapter.Client.RecoveryPoints.GetAccessTokenWithHttpMessagesAsync(vaultName ?? BmsAdapter.GetResourceName(), resourceGroupName ?? BmsAdapter.GetResourceGroupName(), AzureFabricName, containerUri, protectedItemUri, recoveryPointId, userInfo).Result.Body; diff --git a/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/VaultAPIs.cs b/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/VaultAPIs.cs index 7296dd60dc58..966c60df8bd6 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/VaultAPIs.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/BMSAPIs/VaultAPIs.cs @@ -16,6 +16,8 @@ using System.Linq; using Microsoft.Azure.Management.RecoveryServices.Backup.Models; using Microsoft.Azure.Management.RecoveryServices.Models; +using Microsoft.Rest.Azure.OData; +using Newtonsoft.Json; using RestAzureNS = Microsoft.Rest.Azure; namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ServiceClientAdapterNS @@ -100,9 +102,16 @@ public ARSVault GetVault(string resouceGroupName, string vaultName) /// /// Azure region to fetch AAD properties /// vault response object. - public AADPropertiesResource GetAADProperties(string azureRegion) + public AADPropertiesResource GetAADProperties(string azureRegion, string backupManagementType = null) { - AADPropertiesResource aadProperties = BmsAdapter.Client.AadProperties.GetWithHttpMessagesAsync(azureRegion).Result.Body; + ODataQuery queryParams = null; + + if(backupManagementType == BackupManagementType.AzureWorkload) + { + queryParams = new ODataQuery(q => q.BackupManagementType == BackupManagementType.AzureWorkload); + } + + AADPropertiesResource aadProperties = BmsAdapter.Client.AadProperties.GetWithHttpMessagesAsync(azureRegion, queryParams).Result.Body; return aadProperties; } } diff --git a/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/RecoveryServices.Backup.ServiceClientAdapter.csproj b/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/RecoveryServices.Backup.ServiceClientAdapter.csproj index 38068fe9bb63..61498a40d115 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/RecoveryServices.Backup.ServiceClientAdapter.csproj +++ b/src/RecoveryServices/RecoveryServices.Backup.ServiceClientAdapter/RecoveryServices.Backup.ServiceClientAdapter.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.Backup.Test/RecoveryServices.Backup.Test.csproj b/src/RecoveryServices/RecoveryServices.Backup.Test/RecoveryServices.Backup.Test.csproj index 14961658504f..91797c67557f 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Test/RecoveryServices.Backup.Test.csproj +++ b/src/RecoveryServices/RecoveryServices.Backup.Test/RecoveryServices.Backup.Test.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryLogChain.cs b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryLogChain.cs index 49dbeb21f1f9..7e72cb82e3c1 100644 --- a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryLogChain.cs +++ b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryLogChain.cs @@ -69,6 +69,13 @@ public class GetAzureRmRecoveryServicesBackupRecoveryLogChain : RSBackupVaultCmd [ValidateNotNullOrEmpty] public ItemBase Item { get; set; } + /// + /// Switch param to filter Recovery point log chain on secondary region (Cross Region Restore). + /// + [Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.Common.UseSecondaryReg)] + [ValidateNotNullOrEmpty] + public SwitchParameter UseSecondaryRegion { get; set; } + public override void ExecuteCmdlet() { ExecutionBlock(() => @@ -88,6 +95,7 @@ public override void ExecuteCmdlet() providerParameters.Add(VaultParams.VaultName, vaultName); providerParameters.Add(VaultParams.ResourceGroupName, resourceGroupName); providerParameters.Add(RecoveryPointParams.Item, Item); + providerParameters.Add(CRRParams.UseSecondaryRegion, UseSecondaryRegion.IsPresent); if (ParameterSetName == DateTimeFilterParameterSet || ParameterSetName == NoFilterParameterSet) diff --git a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/GetAzureRmRecoveryServicesBackupWorkloadRecoveryConfig.cs b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/GetAzureRmRecoveryServicesBackupWorkloadRecoveryConfig.cs index 3fa73a341517..ea31c455f725 100644 --- a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/GetAzureRmRecoveryServicesBackupWorkloadRecoveryConfig.cs +++ b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/GetAzureRmRecoveryServicesBackupWorkloadRecoveryConfig.cs @@ -127,6 +127,16 @@ public override void ExecuteCmdlet() int offset = (int)timeSpan.TotalSeconds; string targetDb = ""; + if (AlternateWorkloadRestore.IsPresent || RestoreAsFiles.IsPresent) + { + if (TargetContainer == null) + { + throw new ArgumentNullException("TargetContainer", Resources.TargetContainerRequiredException); + } + + azureWorkloadRecoveryConfig.TargetVirtualMachineId = (TargetContainer as AzureVmWorkloadContainer).SourceResourceId; + } + if (TargetItem != null) { if (!string.Equals(((AzureWorkloadProtectableItem)TargetItem).ProtectableItemType, @@ -250,11 +260,6 @@ public override void ExecuteCmdlet() } else if (RestoreAsFiles.IsPresent) { - if(TargetContainer == null) - { - throw new ArgumentNullException("TargetContainer", Resources.TargetContainerRequiredException); - } - azureWorkloadRecoveryConfig.OverwriteWLIfpresent = "No"; azureWorkloadRecoveryConfig.NoRecoveryMode = "Disabled"; azureWorkloadRecoveryConfig.ContainerId = (TargetContainer as AzureVmWorkloadContainer).Id; diff --git a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/RestoreAzureRMRecoveryServicesBackupItem.cs b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/RestoreAzureRMRecoveryServicesBackupItem.cs index 9a0d3cb72aa1..0f01bff8dd68 100644 --- a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/RestoreAzureRMRecoveryServicesBackupItem.cs +++ b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/RestoreAzureRMRecoveryServicesBackupItem.cs @@ -385,10 +385,10 @@ public override void ExecuteCmdlet() var operationId = jobResponse.Request.RequestUri.Segments.Last(); var response = ServiceClientAdapter.GetCrrOperationStatus(secondaryRegion, operationId); - string jobIDJson = JsonConvert.SerializeObject(response.Body.Properties); - string[] jobSplits = jobIDJson.Split(new char[] { '\"' }); - string jobID = jobSplits[jobSplits.Length - 2]; - WriteObject(GetCrrJobObject(secondaryRegion, VaultId, jobID)); + string jobIdJson = JsonConvert.SerializeObject(response.Body.Properties); + string[] jobSplits = jobIdJson.Split(new char[] { '\"' }); + string jobId = jobSplits[jobSplits.Length - 2]; + WriteObject(GetCrrJobObject(secondaryRegion, VaultId, jobId)); } else { diff --git a/src/RecoveryServices/RecoveryServices.Backup/RecoveryServices.Backup.csproj b/src/RecoveryServices/RecoveryServices.Backup/RecoveryServices.Backup.csproj index 058f35894d6d..1f8e243a029a 100644 --- a/src/RecoveryServices/RecoveryServices.Backup/RecoveryServices.Backup.csproj +++ b/src/RecoveryServices/RecoveryServices.Backup/RecoveryServices.Backup.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.SiteRecovery.Test/RecoveryServices.SiteRecovery.Test.csproj b/src/RecoveryServices/RecoveryServices.SiteRecovery.Test/RecoveryServices.SiteRecovery.Test.csproj index f6a845457faf..069ff2be3ac2 100644 --- a/src/RecoveryServices/RecoveryServices.SiteRecovery.Test/RecoveryServices.SiteRecovery.Test.csproj +++ b/src/RecoveryServices/RecoveryServices.SiteRecovery.Test/RecoveryServices.SiteRecovery.Test.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.Test/RecoveryServices.Test.csproj b/src/RecoveryServices/RecoveryServices.Test/RecoveryServices.Test.csproj index 5e3e583928b3..b57f37d0a6b8 100644 --- a/src/RecoveryServices/RecoveryServices.Test/RecoveryServices.Test.csproj +++ b/src/RecoveryServices/RecoveryServices.Test/RecoveryServices.Test.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices.sln b/src/RecoveryServices/RecoveryServices.sln index a7119c5fcf28..bd31d9bdac71 100644 --- a/src/RecoveryServices/RecoveryServices.sln +++ b/src/RecoveryServices/RecoveryServices.sln @@ -1,5 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 +# Visual Studio Version 15 VisualStudioVersion = 15.0.28307.136 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RecoveryServices", "RecoveryServices\RecoveryServices.csproj", "{604260DC-B392-4CF4-81EC-34B14591E2D2}" diff --git a/src/RecoveryServices/RecoveryServices/ChangeLog.md b/src/RecoveryServices/RecoveryServices/ChangeLog.md index 32a6b24b6f63..21aeed034ebe 100644 --- a/src/RecoveryServices/RecoveryServices/ChangeLog.md +++ b/src/RecoveryServices/RecoveryServices/ChangeLog.md @@ -18,6 +18,7 @@ - Additional information about change #1 --> ## Upcoming Release +* Fixing security issue with SQL restore, this is a necessary breaking change. TargetContainer becomes mandatory for Alternate Location Restore. * Removed Set-AzRecoveryServicesBackupProperties cmdlet alias, Set-AzRecoveryServicesBackupProperty is supported. * Removed Get-AzRecoveryServicesBackupJobDetails cmdlet alias, Get-AzRecoveryServicesBackupJobDetail is supported. * Added support for cross subscription DS Move. diff --git a/src/RecoveryServices/RecoveryServices/RecoveryServices.csproj b/src/RecoveryServices/RecoveryServices/RecoveryServices.csproj index 43d83ffc7b12..c7b9b25a5354 100644 --- a/src/RecoveryServices/RecoveryServices/RecoveryServices.csproj +++ b/src/RecoveryServices/RecoveryServices/RecoveryServices.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/RecoveryServices/RecoveryServices/Vault/GetAzureRmRecoveryServicesVaults.cs b/src/RecoveryServices/RecoveryServices/Vault/GetAzureRmRecoveryServicesVaults.cs index b23403663bf8..c0e9e56b3e66 100644 --- a/src/RecoveryServices/RecoveryServices/Vault/GetAzureRmRecoveryServicesVaults.cs +++ b/src/RecoveryServices/RecoveryServices/Vault/GetAzureRmRecoveryServicesVaults.cs @@ -19,7 +19,6 @@ using Microsoft.Azure.Management.RecoveryServices.Models; using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; using System.Collections; -using Microsoft.Azure.Commands.ResourceManager.Common.Tags; namespace Microsoft.Azure.Commands.RecoveryServices { diff --git a/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupRecoveryLogChain.md b/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupRecoveryLogChain.md index 55afd944b5a8..7f7ec723eae9 100644 --- a/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupRecoveryLogChain.md +++ b/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupRecoveryLogChain.md @@ -14,14 +14,15 @@ This command lists the start and end points of the unbroken log chain of the giv ### NoFilterParameterSet (Default) ``` -Get-AzRecoveryServicesBackupRecoveryLogChain [-Item] [-VaultId ] +Get-AzRecoveryServicesBackupRecoveryLogChain [-Item] [-UseSecondaryRegion] [-VaultId ] [-DefaultProfile ] [] ``` ### DateTimeFilter ``` Get-AzRecoveryServicesBackupRecoveryLogChain [[-StartDate] ] [[-EndDate] ] - [-Item] [-VaultId ] [-DefaultProfile ] [] + [-Item] [-UseSecondaryRegion] [-VaultId ] [-DefaultProfile ] + [] ``` ## DESCRIPTION @@ -48,7 +49,8 @@ The last command gets an array of recovery point time ranges for the item in $Ba This command lists the start and end points of the unbroken log chain of the given backup item. (autogenerated) -```powershell +```powershell + Get-AzRecoveryServicesBackupRecoveryLogChain -Item $Item -VaultId $vault.ID ``` @@ -114,6 +116,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -UseSecondaryRegion +Filters from Secondary Region for Cross Region Restore + +```yaml +Type: System.Management.Automation.SwitchParameter +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -VaultId ARM ID of the Recovery Services Vault. diff --git a/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupWorkloadRecoveryConfig.md b/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupWorkloadRecoveryConfig.md index fe6a4d30e1de..9d35601f1177 100644 --- a/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupWorkloadRecoveryConfig.md +++ b/src/RecoveryServices/RecoveryServices/help/Get-AzRecoveryServicesBackupWorkloadRecoveryConfig.md @@ -38,19 +38,20 @@ The command returns a recovery config for AzureWorkload items which is passed to ### Example 1 ```powershell PS C:\> $SQLRecoveryObject = Get-AzRecoveryServicesBackupRecoveryPoint -Item $SQLBkpItem $startdate $enddate | Get-AzRecoveryServicesWorkloadRecoveryConfig -OriginalWorkloadRestore -PS C:\> $SQLRecoveryObject = Get-AzRecoveryServicesBackupRecoveryPoint -Item $SQLBkpItem $startdate $enddate | Get-AzRecoveryServicesWorkloadRecoveryConfig -AlternateWorkloadRestore -TargetItem $SQLProtItem +PS C:\> $SQLRecoveryObject = Get-AzRecoveryServicesBackupRecoveryPoint -Item $SQLBkpItem $startdate $enddate | Get-AzRecoveryServicesWorkloadRecoveryConfig -AlternateWorkloadRestore -TargetItem $SQLProtItem -TargetContainer $targetVMContainer ``` The first cmdlet is used to get the Recovery point object. The second cmdlet creates a recovery plan for a original location restore. THe third cmdlet creates a recovery plan for a alternate location restore. +Note: Parameter -TargetContainer is mandatory in case of AlternateLocationRestore or RestoreAsFiles. ### Example 2 This command constructs the recovery configuration of a backed up item such as SQL DB. (autogenerated) ```powershell -Get-AzRecoveryServicesBackupWorkloadRecoveryConfig -AlternateWorkloadRestore -RecoveryPoint $rp[0] -TargetItem -VaultId $vault.ID +Get-AzRecoveryServicesBackupWorkloadRecoveryConfig -AlternateWorkloadRestore -RecoveryPoint $rp[0] -TargetItem -TargetContainer $targetVMContainer -VaultId $vault.ID ``` ## PARAMETERS @@ -191,7 +192,7 @@ Accept wildcard characters: False ``` ### -TargetContainer -Specifies the target machine on which DB Files need to be restored. +Specifies the target machine on which DB Files need to be restored. TargetContainer is mandatory in case of AlternateLocationRestore or RestoreAsFiles. ```yaml Type: Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models.ContainerBase