diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/Conversions/RecoveryPointConversions.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/Conversions/RecoveryPointConversions.cs index b1e5d1039a6b..ff26b3762991 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/Conversions/RecoveryPointConversions.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/Conversions/RecoveryPointConversions.cs @@ -12,10 +12,10 @@ // limitations under the License. // ---------------------------------------------------------------------------------- -using System; -using System.Collections.Generic; using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties; +using System; +using System.Collections.Generic; using ServiceClientModel = Microsoft.Azure.Management.RecoveryServices.Backup.Models; namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers @@ -57,6 +57,11 @@ public static List GetPSAzureRecoveryPoints( result.Add(GetPSAzureFileRecoveryPoint(rp, item)); } + else if (rp.Properties.GetType().IsSubclassOf(typeof(ServiceClientModel.AzureWorkloadRecoveryPoint))) + { + result.Add(GetPSAzureWorkloadRecoveryPoint(rp, item)); + } + else if (rp.Properties.GetType() == typeof(ServiceClientModel.GenericRecoveryPoint)) { result.Add(GetPSAzureGenericRecoveryPoint(rp, item)); @@ -92,6 +97,11 @@ public static RecoveryPointBase GetPSAzureRecoveryPoints( result = GetPSAzureFileRecoveryPoint(rpResponse, item); } + else if (rpResponse.Properties.GetType().IsSubclassOf(typeof(ServiceClientModel.AzureWorkloadRecoveryPoint))) + { + result = GetPSAzureWorkloadRecoveryPoint(rpResponse, item); + } + else if (rpResponse.Properties.GetType() == typeof(ServiceClientModel.GenericRecoveryPoint)) { @@ -203,6 +213,45 @@ public static RecoveryPointBase GetPSAzureFileRecoveryPoint( return rpBase; } + public static RecoveryPointBase GetPSAzureWorkloadRecoveryPoint( + ServiceClientModel.RecoveryPointResource rp, ItemBase item) + { + Dictionary uriDict = HelperUtils.ParseUri(item.Id); + string containerUri = HelperUtils.GetContainerUri(uriDict, item.Id); + string protectedItemUri = HelperUtils.GetProtectedItemUri(uriDict, item.Id); + + string containerName = IdUtils.GetNameFromUri(containerUri); + string protectedItemName = IdUtils.GetNameFromUri(protectedItemUri); + + ServiceClientModel.AzureWorkloadRecoveryPoint recoveryPoint = + rp.Properties as ServiceClientModel.AzureWorkloadRecoveryPoint; + + DateTime recoveryPointTime = DateTime.MinValue; + + if (recoveryPoint.RecoveryPointTimeInUTC.HasValue) + { + recoveryPointTime = (DateTime)recoveryPoint.RecoveryPointTimeInUTC; + } + else + { + throw new ArgumentNullException("RecoveryPointTime is null"); + } + + AzureWorkloadRecoveryPoint rpBase = new AzureWorkloadRecoveryPoint() + { + RecoveryPointId = rp.Name, + BackupManagementType = item.BackupManagementType, + ItemName = protectedItemName, + ContainerName = containerName, + ContainerType = item.ContainerType, + RecoveryPointTime = recoveryPointTime, + RecoveryPointType = recoveryPoint.Type, + Id = rp.Id, + WorkloadType = item.WorkloadType, + }; + return rpBase; + } + public static RecoveryPointBase GetPSAzureGenericRecoveryPoint( ServiceClientModel.RecoveryPointResource rp, ItemBase item) { diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/ServiceClientHelpers.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/ServiceClientHelpers.cs index 07acea7e5bbf..b6ab24a37197 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/ServiceClientHelpers.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Helpers/ServiceClientHelpers.cs @@ -76,6 +76,9 @@ public static string GetServiceClientProviderType(CmdletModel.WorkloadType workl case CmdletModel.WorkloadType.AzureFiles: providerType = ServiceClientModel.BackupManagementType.AzureStorage.ToString(); break; + case CmdletModel.WorkloadType.MSSQL: + providerType = ServiceClientModel.BackupManagementType.AzureWorkload.ToString(); + break; default: break; } @@ -353,4 +356,4 @@ public static string GetServiceClientWorkloadType(CmdletModel.WorkloadType workl return serviceClientWorkloadType; } } -} +} \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/AzureWorkloadModels/AzureWorkloadRecoveryPoint.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/AzureWorkloadModels/AzureWorkloadRecoveryPoint.cs new file mode 100644 index 000000000000..8b4b1d5210fb --- /dev/null +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/AzureWorkloadModels/AzureWorkloadRecoveryPoint.cs @@ -0,0 +1,27 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models +{ + /// + /// Azure workload specific recovery point class. + /// + public class AzureWorkloadRecoveryPoint : AzureRecoveryPoint + { + public AzureWorkloadRecoveryPoint() + { + + } + } +} \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CmdletParamEnums.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CmdletParamEnums.cs index 8c7821e52dea..b6696d04007b 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CmdletParamEnums.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CmdletParamEnums.cs @@ -45,6 +45,7 @@ public enum RecoveryPointParams TargetLocation, KeyFileDownloadLocation, FileDownloadLocation, + RestorePointQueryType } public enum RestoreBackupItemParams @@ -70,6 +71,16 @@ public enum RestoreFSBackupItemParams TargetFolder } + public enum WorkloadRecoveryConfigParams + { + PointInTime, + RecoveryPoint, + OriginalWorkloadRestore, + Item, + TargetFileShareName, + TargetFolder + } + public enum PolicyParams { WorkloadType, diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Enums.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Enums.cs index 1ac388827f41..1b3551a3a303 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Enums.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Enums.cs @@ -37,7 +37,12 @@ public enum ContainerType /// /// Represents any Azure Storage containers. /// - AzureStorage + AzureStorage, + + /// + /// Represents any Azure Workload containers. + /// + AzureWorkload } /// @@ -70,6 +75,7 @@ public enum BackupManagementType /// Represents Azure File Storage. https://docs.microsoft.com/en-in/azure/storage/files/storage-files-introduction /// AzureStorage, + AzureWorkload, } /// @@ -103,6 +109,7 @@ public enum WorkloadType /// Represents Azure File https://docs.microsoft.com/en-in/azure/storage/files/storage-files-introduction /// AzureFiles, + MSSQL, } /// @@ -134,6 +141,7 @@ public enum PsBackupProviderTypes /// Represents the Azure File provider for powershell cmdlets. /// AzureFiles, + AzureWorkload, } /// @@ -334,4 +342,4 @@ public enum SourceFileType File, Directory } -} +} \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Utils.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Utils.cs index 526188855a4f..019db748a1a5 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Utils.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Models/CommonModels/Utils.cs @@ -218,6 +218,8 @@ public static BackupManagementType GetPsBackupManagementType(string backupManage return BackupManagementType.AzureSQL; case ServiceClientModel.BackupManagementType.AzureStorage: return BackupManagementType.AzureStorage; + case ServiceClientModel.BackupManagementType.AzureWorkload: + return BackupManagementType.AzureWorkload; default: throw new Exception("Unsupported BackupManagmentType: " + backupManagementType); } @@ -248,6 +250,11 @@ public static ContainerType GetPsContainerType(string containerType) { return ContainerType.AzureStorage; } + else if (containerType == + ServiceClientModel.BackupManagementType.AzureWorkload) + { + return ContainerType.AzureWorkload; + } else { throw new Exception("Unsupported ContainerType: " + containerType); @@ -265,14 +272,18 @@ public static WorkloadType GetPsWorkloadType(string workloadType) { return WorkloadType.AzureVM; } - if (workloadType == ServiceClientModel.WorkloadType.AzureSqlDb.ToString()) + else if (workloadType == ServiceClientModel.WorkloadType.AzureSqlDb.ToString()) { return WorkloadType.AzureSQLDatabase; } - if (workloadType == ServiceClientModel.WorkloadType.AzureFileShare) + else if (workloadType == ServiceClientModel.WorkloadType.AzureFileShare) { return WorkloadType.AzureFiles; } + else if (workloadType == ServiceClientModel.WorkloadType.SQLDataBase) + { + return WorkloadType.MSSQL; + } else { throw new Exception("Unsupported WorkloadType: " + workloadType); @@ -290,14 +301,18 @@ public static string GetServiceClientWorkloadType(string workloadType) { return ServiceClientModel.WorkloadType.VM; } - if (workloadType == WorkloadType.AzureSQLDatabase.ToString()) + else if (workloadType == WorkloadType.AzureSQLDatabase.ToString()) { return ServiceClientModel.WorkloadType.AzureSqlDb; } - if (workloadType == WorkloadType.AzureFiles.ToString()) + else if (workloadType == WorkloadType.AzureFiles.ToString()) { return ServiceClientModel.WorkloadType.AzureFileShare; } + else if (workloadType == WorkloadType.MSSQL.ToString()) + { + return ServiceClientModel.WorkloadType.SQLDataBase; + } else { throw new Exception("Unsupported WorkloadType: " + workloadType); @@ -343,4 +358,4 @@ public static string GetWorkloadTypeFromArmType(string armType) throw new Exception("Unsupported ArmType: " + armType); } } -} +} \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs index b7fb5f2a1bd8..1070585c705a 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/AzureWorkloadProviderHelper.cs @@ -12,6 +12,7 @@ // limitations under the License. // ---------------------------------------------------------------------------------- +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ServiceClientAdapterNS; using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers; using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties; @@ -291,17 +292,18 @@ public void CopyScheduleTimeToRetentionTimes(CmdletModel.LongTermRetentionPolicy } } - public List ListRecoveryPoints(Dictionary ProviderData) + public List ListRecoveryPoints(Dictionary ProviderData) { - string vaultName = (string)ProviderData[CmdletModel.VaultParams.VaultName]; - string resourceGroupName = (string)ProviderData[CmdletModel.VaultParams.ResourceGroupName]; - DateTime startDate = (DateTime)(ProviderData[CmdletModel.RecoveryPointParams.StartDate]); - DateTime endDate = (DateTime)(ProviderData[CmdletModel.RecoveryPointParams.EndDate]); + string vaultName = (string)ProviderData[VaultParams.VaultName]; + string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName]; + DateTime startDate = (DateTime)(ProviderData[RecoveryPointParams.StartDate]); + DateTime endDate = (DateTime)(ProviderData[RecoveryPointParams.EndDate]); + string restorePointQueryType = ProviderData.ContainsKey(RecoveryPointParams.RestorePointQueryType) ? + (string)ProviderData[RecoveryPointParams.RestorePointQueryType] : "All"; - CmdletModel.ItemBase item = ProviderData[CmdletModel.RecoveryPointParams.Item] - as CmdletModel.ItemBase; + ItemBase item = ProviderData[RecoveryPointParams.Item] as ItemBase; - Dictionary uriDict = HelperUtils.ParseUri(item.Id); + Dictionary uriDict = HelperUtils.ParseUri(item.Id); string containerUri = HelperUtils.GetContainerUri(uriDict, item.Id); string protectedItemName = HelperUtils.GetProtectedItemUri(uriDict, item.Id); @@ -315,7 +317,8 @@ public void CopyScheduleTimeToRetentionTimes(CmdletModel.LongTermRetentionPolicy var queryFilterString = QueryBuilder.Instance.GetQueryString(new BMSRPQueryObject() { StartDate = startDate, - EndDate = endDate + EndDate = endDate, + RestorePointQueryType = restorePointQueryType }); ODataQuery queryFilter = new ODataQuery(); @@ -330,16 +333,70 @@ public void CopyScheduleTimeToRetentionTimes(CmdletModel.LongTermRetentionPolicy return RecoveryPointConversions.GetPSAzureRecoveryPoints(rpListResponse, item); } - public CmdletModel.RecoveryPointBase GetRecoveryPointDetails(Dictionary ProviderData) + public List ListLogChains(Dictionary ProviderData) { - string vaultName = (string)ProviderData[CmdletModel.VaultParams.VaultName]; - string resourceGroupName = (string)ProviderData[CmdletModel.VaultParams.ResourceGroupName]; - CmdletModel.ItemBase item = ProviderData[CmdletModel.RecoveryPointParams.Item] - as CmdletModel.ItemBase; + string vaultName = (string)ProviderData[VaultParams.VaultName]; + string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName]; + DateTime startDate = (DateTime)(ProviderData[RecoveryPointParams.StartDate]); + DateTime endDate = (DateTime)(ProviderData[RecoveryPointParams.EndDate]); + string restorePointQueryType = (string)ProviderData[RecoveryPointParams.RestorePointQueryType]; - string recoveryPointId = ProviderData[CmdletModel.RecoveryPointParams.RecoveryPointId].ToString(); + ItemBase item = ProviderData[RecoveryPointParams.Item] as ItemBase; - Dictionary uriDict = HelperUtils.ParseUri(item.Id); + Dictionary uriDict = HelperUtils.ParseUri(item.Id); + string containerUri = HelperUtils.GetContainerUri(uriDict, item.Id); + string protectedItemName = HelperUtils.GetProtectedItemUri(uriDict, item.Id); + + TimeSpan duration = endDate - startDate; + if (duration.TotalDays > 30) + { + throw new Exception(Resources.RestoreDiskTimeRangeError); + } + + //we need to fetch the list of RPs + var queryFilterString = QueryBuilder.Instance.GetQueryString(new BMSRPQueryObject() + { + StartDate = startDate, + EndDate = endDate, + RestorePointQueryType = restorePointQueryType + }); + + ODataQuery queryFilter = new ODataQuery(); + queryFilter.Filter = queryFilterString; + + List rpListResponse = ServiceClientAdapter.GetRecoveryPoints( + containerUri, + protectedItemName, + queryFilter, + vaultName: vaultName, + resourceGroupName: resourceGroupName); + + List timeRanges = new List(); + foreach (RecoveryPointResource rp in rpListResponse) + { + if (rp.Properties.GetType() == typeof(AzureWorkloadSQLPointInTimeRecoveryPoint)) + { + AzureWorkloadSQLPointInTimeRecoveryPoint recoveryPoint = + rp.Properties as AzureWorkloadSQLPointInTimeRecoveryPoint; + foreach (PointInTimeRange timeRange in recoveryPoint.TimeRanges) + { + timeRanges.Add(timeRange); + } + } + + } + return timeRanges; + } + + public RecoveryPointBase GetRecoveryPointDetails(Dictionary ProviderData) + { + string vaultName = (string)ProviderData[VaultParams.VaultName]; + string resourceGroupName = (string)ProviderData[VaultParams.ResourceGroupName]; + ItemBase item = ProviderData[RecoveryPointParams.Item] as ItemBase; + + string recoveryPointId = ProviderData[RecoveryPointParams.RecoveryPointId].ToString(); + + Dictionary uriDict = HelperUtils.ParseUri(item.Id); string containerUri = HelperUtils.GetContainerUri(uriDict, item.Id); string protectedItemName = HelperUtils.GetProtectedItemUri(uriDict, item.Id); diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Commands.RecoveryServices.Backup.Providers.csproj b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Commands.RecoveryServices.Backup.Providers.csproj new file mode 100644 index 000000000000..a7c0bb54ea7e --- /dev/null +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Commands.RecoveryServices.Backup.Providers.csproj @@ -0,0 +1,93 @@ + + + + + + Debug + AnyCPU + {02234E90-BCDE-4B20-B1F5-01B1005821DB} + Library + Properties + Microsoft.Azure.Commands.RecoveryServices.Backup.Providers + Microsoft.Azure.Commands.RecoveryServices.Backup.Providers + v4.5.2 + 512 + ..\ + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + prompt + 4 + TRACE;SIGN + true + MSSharedLibKey.snk + true + false + + + + False + ..\..\..\packages\Microsoft.Azure.Management.RecoveryServices.Backup.3.0.1-preview\lib\net452\Microsoft.Azure.Management.RecoveryServices.Backup.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + {142d7b0b-388a-4ceb-a228-7f6d423c5c2e} + Commands.Profile + + + {0e1d3f36-e6c8-4764-8c7d-6f9ee537490c} + Commands.RecoveryServices.Backup.Helpers + + + {5e675749-6139-464a-904c-59c0ffdfec82} + Commands.RecoveryServices.Backup.Logger + + + {30b92759-50b3-494e-b9f0-ec9a2ce9d57b} + Commands.RecoveryServices.Backup.Models + + + {b758fec1-35c1-4f93-a954-66dd33f6e0ec} + Commands.RecoveryServices.Backup.ServiceClientAdapter + + + + + + + + \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/IPsBackupProvider.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/IPsBackupProvider.cs index 3fa166fbaf8a..75ebf831bfe0 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/IPsBackupProvider.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/IPsBackupProvider.cs @@ -60,5 +60,7 @@ public interface IPsBackupProvider RPMountScriptDetails ProvisionItemLevelRecoveryAccess(); void RevokeItemLevelRecoveryAccess(); + + List GetLogChains(); } } diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureFilesPsBackupProvider.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureFilesPsBackupProvider.cs index cd54f4a273cf..174721b5753d 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureFilesPsBackupProvider.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureFilesPsBackupProvider.cs @@ -914,5 +914,10 @@ private void ValidateLocationRestoreRequest(string targetFileShareName, string t throw new ArgumentException(string.Format(Resources.AzureFileTargetSANameMissingException)); } } + + public List GetLogChains() + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureSqlPsBackupProvider.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureSqlPsBackupProvider.cs index 29a4979f2013..c4413ea314c3 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureSqlPsBackupProvider.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureSqlPsBackupProvider.cs @@ -485,6 +485,11 @@ public List ListProtectedItems() return itemModels; } + public List GetLogChains() + { + throw new NotImplementedException(); + } + #region private private void ValidateAzureSqlWorkloadType(CmdletModel.WorkloadType type) { diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs new file mode 100644 index 000000000000..9e83e5f71675 --- /dev/null +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs @@ -0,0 +1,140 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ServiceClientAdapterNS; +using Microsoft.Azure.Management.RecoveryServices.Backup.Models; +using System; +using System.Collections.Generic; +using CmdletModel = Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; +using RestAzureNS = Microsoft.Rest.Azure; + +namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ProviderModel +{ + /// + /// This class implements methods for azure DB Workload backup provider + /// + public class AzureWorkloadPsBackupProvider : IPsBackupProvider + { + private const int defaultOperationStatusRetryTimeInMilliSec = 5 * 1000; // 5 sec + private const string separator = ";"; + private const CmdletModel.RetentionDurationType defaultFileRetentionType = + CmdletModel.RetentionDurationType.Days; + private const int defaultFileRetentionCount = 30; + Dictionary ProviderData { get; set; } + ServiceClientAdapter ServiceClientAdapter { get; set; } + AzureWorkloadProviderHelper AzureWorkloadProviderHelper { get; set; } + /// + /// Initializes the provider with the data recieved from the cmdlet layer + /// + /// Data from the cmdlet layer intended for the provider + /// Service client adapter for communicating with the backend service + public void Initialize(Dictionary providerData, ServiceClientAdapter serviceClientAdapter) + { + ProviderData = providerData; + ServiceClientAdapter = serviceClientAdapter; + AzureWorkloadProviderHelper = new AzureWorkloadProviderHelper(ServiceClientAdapter); + } + + public ResourceBackupStatus CheckBackupStatus() + { + throw new NotImplementedException(); + } + + public ProtectionPolicyResource CreatePolicy() + { + throw new NotImplementedException(); + } + + public RestAzureNS.AzureOperationResponse DisableProtection() + { + throw new NotImplementedException(); + } + + public RestAzureNS.AzureOperationResponse EnableProtection() + { + throw new NotImplementedException(); + } + + public RetentionPolicyBase GetDefaultRetentionPolicyObject() + { + throw new NotImplementedException(); + } + + public SchedulePolicyBase GetDefaultSchedulePolicyObject() + { + throw new NotImplementedException(); + } + + public ProtectedItemResource GetProtectedItem() + { + throw new NotImplementedException(); + } + + public RecoveryPointBase GetRecoveryPointDetails() + { + return AzureWorkloadProviderHelper.GetRecoveryPointDetails(ProviderData); + } + + public List ListBackupManagementServers() + { + throw new NotImplementedException(); + } + + public List ListProtectedItems() + { + throw new NotImplementedException(); + } + + public List ListProtectionContainers() + { + throw new NotImplementedException(); + } + + public List ListRecoveryPoints() + { + return AzureWorkloadProviderHelper.ListRecoveryPoints(ProviderData); + } + + public RestAzureNS.AzureOperationResponse ModifyPolicy() + { + throw new NotImplementedException(); + } + + public RPMountScriptDetails ProvisionItemLevelRecoveryAccess() + { + throw new NotImplementedException(); + } + + public void RevokeItemLevelRecoveryAccess() + { + throw new NotImplementedException(); + } + + public RestAzureNS.AzureOperationResponse TriggerBackup() + { + throw new NotImplementedException(); + } + + public RestAzureNS.AzureOperationResponse TriggerRestore() + { + throw new NotImplementedException(); + } + + public List GetLogChains() + { + return AzureWorkloadProviderHelper.ListLogChains(ProviderData); + } + } +} \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/DpmPsBackupProvider.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/DpmPsBackupProvider.cs index ece71b39e9b8..f367316f3ccf 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/DpmPsBackupProvider.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/DpmPsBackupProvider.cs @@ -154,5 +154,10 @@ public List ListProtectedItems() { throw new NotImplementedException(); } + + public List GetLogChains() + { + throw new NotImplementedException(); + } } } diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/IaasVmPsBackupProvider.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/IaasVmPsBackupProvider.cs index 979ce2eca53b..d9a86a43cbfb 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/IaasVmPsBackupProvider.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/IaasVmPsBackupProvider.cs @@ -18,7 +18,6 @@ using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers; using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties; using Microsoft.Azure.Management.Internal.Resources.Models; -using Microsoft.Azure.Management.Internal.Resources.Utilities.Models; using Microsoft.Azure.Management.RecoveryServices.Backup.Models; using Microsoft.Rest.Azure.OData; using System; @@ -1261,6 +1260,11 @@ private bool ShouldUseOsa(AzureVmRecoveryPoint rp, bool osaOption) return useOsa; } + public List GetLogChains() + { + throw new NotImplementedException(); + } + #endregion } } diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/MabPsBackupProvider.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/MabPsBackupProvider.cs index 5e5f8d15dd9e..1e00189b0b72 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/MabPsBackupProvider.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/Providers/MabPsBackupProvider.cs @@ -157,5 +157,10 @@ public List ListProtectedItems() { throw new NotImplementedException(); } + + public List GetLogChains() + { + throw new NotImplementedException(); + } } } diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/PsBackupProviderManager.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/PsBackupProviderManager.cs index 3495a997a853..820d8ea293cc 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/PsBackupProviderManager.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Providers/PsBackupProviderManager.cs @@ -122,6 +122,20 @@ public IPsBackupProvider GetProviderInstance containerType)); } break; + case ContainerType.AzureWorkload: + if (backupManagementType == BackupManagementType.AzureWorkload || + backupManagementType == null) + { + providerType = PsBackupProviderTypes.AzureWorkload; + } + else + { + throw new ArgumentException( + string.Format( + Resources.BackupManagementTypeRequiredForContainerType, + containerType)); + } + break; default: throw new ArgumentException( string.Format(Resources.UnsupportedContainerType, @@ -215,6 +229,16 @@ public IPsBackupProvider GetProviderInstance( } psProviderType = PsBackupProviderTypes.AzureFiles; break; + case WorkloadType.MSSQL: + if (backupManagementType.HasValue && + backupManagementType != BackupManagementType.AzureWorkload) + { + throw new ArgumentException( + string.Format(Resources.BackupManagementTypeNotExpectedForWorkloadType, + workloadType.ToString())); + } + psProviderType = PsBackupProviderTypes.AzureWorkload; + break; default: throw new ArgumentException( string.Format(Resources.UnsupportedWorkloadTypeException, @@ -248,6 +272,9 @@ public IPsBackupProvider GetProviderInstance(PsBackupProviderTypes providerType) case PsBackupProviderTypes.AzureFiles: psBackupProvider = new AzureFilesPsBackupProvider(); break; + case PsBackupProviderTypes.AzureWorkload: + psBackupProvider = new AzureWorkloadPsBackupProvider(); + break; default: break; } @@ -277,4 +304,4 @@ public IPsBackupProvider GetProviderInstance(string resourceType) } } } -} +} \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ItemTests.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ItemTests.cs new file mode 100644 index 000000000000..ea4357d7f77c --- /dev/null +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ItemTests.cs @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; +using Microsoft.WindowsAzure.Commands.ScenarioTest; +using Microsoft.WindowsAzure.Commands.Test.Utilities.Common; +using Xunit; + +namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Test.ScenarioTests +{ + public partial class ItemTests : RMTestBase + { + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + [Trait(TestConstants.Workload, TestConstants.AzureWorkload)] + public void TestAzureWorkloadGetRPs() + { + TestController.NewInstance.RunPsTest( + _logger, PsBackupProviderTypes.AzureWorkload, "Test-AzureWorkloadGetRPs"); + } + + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + [Trait(TestConstants.Workload, TestConstants.AzureWorkload)] + public void TestAzureWorkloadGetLogChains() + { + TestController.NewInstance.RunPsTest( + _logger, PsBackupProviderTypes.AzureWorkload, "Test-AzureWorkloadGetLogChains"); + } + } +} diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ItemTests.ps1 b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ItemTests.ps1 new file mode 100644 index 000000000000..1e3dc754ea12 --- /dev/null +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ItemTests.ps1 @@ -0,0 +1,43 @@ +# ---------------------------------------------------------------------------------- +# +# Copyright Microsoft Corporation +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------------- + +function Test-AzureWorkloadGetRPs +{ + try + { + # Test 1: Get latest recovery point; should be only one + Get-AzureRmRecoveryServicesVault -ResourceGroupName 'shracrg' -Name 'shracsql' | Set-AzureRmRecoveryServicesVaultContext + + $recoveryPoint = Get-AzureRmRecoveryServicesBackupRecoveryPoint + } + finally + { + + } +} + +function Test-AzureWorkloadGetLogChains +{ + try + { + # Test 1: Get latest recovery point; should be only one + Get-AzureRmRecoveryServicesVault -ResourceGroupName 'shracrg' -Name 'shracsql' | Set-AzureRmRecoveryServicesVaultContext + + $recoveryPoint = Get-AzRecoveryServicesBackupRecoveryLogChain + } + finally + { + + } +} \ No newline at end of file diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/TestConstants.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/TestConstants.cs index ed14871dd2d9..08a52174f6f8 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/TestConstants.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup.Test/TestConstants.cs @@ -30,5 +30,7 @@ public class TestConstants public const string MAB = "MAB"; public const string AzureFS = "AzureFS"; + + public const string AzureWorkload = "AzureWorkload"; } } diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryLogChain.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryLogChain.cs new file mode 100644 index 000000000000..f010a5474a9f --- /dev/null +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryLogChain.cs @@ -0,0 +1,153 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ProviderModel; +using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties; +using Microsoft.Azure.Management.Internal.Resources.Utilities.Models; +using System; +using System.Collections.Generic; +using System.Management.Automation; + +namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets +{ + /// + /// Gets recovery points created for the provided item protected by the recovery services vault + /// + [Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "RecoveryServicesBackupRecoveryLogChain", DefaultParameterSetName = NoFilterParameterSet), OutputType(typeof(RecoveryPointBase))] + public class GetAzureRmRecoveryServicesBackupRecoveryLogChain : RSBackupVaultCmdletBase + { + internal const string DateTimeFilterParameterSet = "DateTimeFilter"; + internal const string NoFilterParameterSet = "NoFilterParameterSet"; + + /// + /// Start time of Time range for which recovery point needs to be fetched + /// + [Parameter(Mandatory = false, ParameterSetName = DateTimeFilterParameterSet, + ValueFromPipeline = false, Position = 0, HelpMessage = ParamHelpMsgs.RecoveryPoint.StartDate)] + [ValidateNotNullOrEmpty] + public DateTime? StartDate { get; set; } + + /// + /// End time of Time range for which recovery points need to be fetched + /// + [Parameter( + Mandatory = false, + ParameterSetName = DateTimeFilterParameterSet, + ValueFromPipeline = false, + Position = 1, + HelpMessage = ParamHelpMsgs.RecoveryPoint.EndDate)] + [ValidateNotNullOrEmpty] + public DateTime? EndDate { get; set; } + + /// + /// Protected Item object for which recovery points need to be fetched + /// + [Parameter( + Mandatory = true, + ParameterSetName = DateTimeFilterParameterSet, + ValueFromPipeline = true, + Position = 2, + HelpMessage = ParamHelpMsgs.RecoveryPoint.Item)] + [Parameter( + Mandatory = true, + ParameterSetName = NoFilterParameterSet, + ValueFromPipeline = true, + Position = 0, + HelpMessage = ParamHelpMsgs.RecoveryPoint.Item)] + [ValidateNotNullOrEmpty] + public ItemBase Item { get; set; } + + public override void ExecuteCmdlet() + { + ExecutionBlock(() => + { + //Validate start time < end time + base.ExecuteCmdlet(); + + ResourceIdentifier resourceIdentifier = new ResourceIdentifier(VaultId); + string vaultName = resourceIdentifier.ResourceName; + string resourceGroupName = resourceIdentifier.ResourceGroupName; + + // initialize values to default + DateTime rangeEnd = DateTime.UtcNow; + DateTime rangeStart = rangeEnd.AddDays(-30); + + Dictionary providerParameters = new Dictionary(); + providerParameters.Add(VaultParams.VaultName, vaultName); + providerParameters.Add(VaultParams.ResourceGroupName, resourceGroupName); + providerParameters.Add(RecoveryPointParams.Item, Item); + + if (ParameterSetName == DateTimeFilterParameterSet || + ParameterSetName == NoFilterParameterSet) + { + // if both start and end date are given by user + if (StartDate.HasValue && EndDate.HasValue) + { + rangeStart = StartDate.Value; + rangeEnd = EndDate.Value; + } + // if only start date is given by user + else if (StartDate.HasValue && EndDate.HasValue == false) + { + rangeStart = StartDate.Value; + rangeEnd = rangeStart.AddDays(30); + } + // if only end date is given by user + else if (EndDate.HasValue && StartDate.HasValue == false) + { + rangeEnd = EndDate.Value; + rangeStart = rangeEnd.AddDays(-30); + } + + //User want list of RPs between given time range + WriteDebug(string.Format("ParameterSet = DateTimeFilterParameterSet. \n" + + "StartDate = {0} EndDate = {1}, Item.Name = {2}, Item.ContainerName = {3}", + rangeStart, rangeEnd, Item.Name, Item.ContainerName)); + if (rangeStart >= rangeEnd) + { + throw new ArgumentException(Resources.RecoveryPointEndDateShouldBeGreater); + } + + if (rangeStart.Kind != DateTimeKind.Utc || rangeEnd.Kind != DateTimeKind.Utc) + { + throw new ArgumentException(Resources.GetRPErrorInputDatesShouldBeInUTC); + } + + if (rangeStart > DateTime.UtcNow) + { + throw new ArgumentException( + Resources.GetRPErrorStartTimeShouldBeLessThanUTCNow); + } + + providerParameters.Add(RecoveryPointParams.StartDate, rangeStart); + providerParameters.Add(RecoveryPointParams.EndDate, rangeEnd); + providerParameters.Add(RecoveryPointParams.RestorePointQueryType, "Log"); + + PsBackupProviderManager providerManager = + new PsBackupProviderManager(providerParameters, ServiceClientAdapter); + IPsBackupProvider psBackupProvider = + providerManager.GetProviderInstance(Item.ContainerType, Item.BackupManagementType); + var rpList = psBackupProvider.GetLogChains(); + + WriteObject(rpList, enumerateCollection: true); + } + else + { + throw new Exception(Resources.RecoveryPointUnsupportedParamet); + } + }); + } + } +} diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryPoint.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryPoint.cs index 1ca38b9ba313..fc034c6a0bfd 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryPoint.cs +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/RecoveryPoint/GetAzureRmRecoveryServicesBackupRecoveryPoint.cs @@ -12,20 +12,20 @@ // limitations under the License. // ---------------------------------------------------------------------------------- -using System; -using System.Collections.Generic; -using System.Management.Automation; using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ProviderModel; using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties; using Microsoft.Azure.Management.Internal.Resources.Utilities.Models; +using System; +using System.Collections.Generic; +using System.Management.Automation; namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets { /// /// Gets recovery points created for the provided item protected by the recovery services vault /// - [Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "RecoveryServicesBackupRecoveryPoint",DefaultParameterSetName = NoFilterParameterSet),OutputType(typeof(RecoveryPointBase))] + [Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "RecoveryServicesBackupRecoveryPoint", DefaultParameterSetName = NoFilterParameterSet), OutputType(typeof(RecoveryPointBase))] public class GetAzureRmRecoveryServicesBackupRecoveryPoint : RSBackupVaultCmdletBase { internal const string DateTimeFilterParameterSet = "DateTimeFilter"; @@ -137,8 +137,8 @@ public override void ExecuteCmdlet() //User want list of RPs between given time range WriteDebug(string.Format("ParameterSet = DateTimeFilterParameterSet. \n" + - "StartDate = {0} EndDate = {1}, Item.Name = {2}, Item.ContainerName = {3}", - rangeStart, rangeEnd, Item.Name, Item.ContainerName)); + "StartDate = {0} EndDate = {1}, Item.Name = {2}, Item.ContainerName = {3}", + rangeStart, rangeEnd, Item.Name, Item.ContainerName)); if (rangeStart >= rangeEnd) { throw new ArgumentException(Resources.RecoveryPointEndDateShouldBeGreater); @@ -157,6 +157,12 @@ public override void ExecuteCmdlet() providerParameters.Add(RecoveryPointParams.StartDate, rangeStart); providerParameters.Add(RecoveryPointParams.EndDate, rangeEnd); + if (string.Compare(Item.BackupManagementType.ToString(), + BackupManagementType.AzureWorkload.ToString()) == 0) + { + providerParameters.Add(RecoveryPointParams.RestorePointQueryType, "FullAndDifferential"); + } + PsBackupProviderManager providerManager = new PsBackupProviderManager(providerParameters, ServiceClientAdapter); IPsBackupProvider psBackupProvider = diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/Restore/GetAzureRmRecoveryServicesWorkloadRecoveryConfig.cs b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/Restore/GetAzureRmRecoveryServicesWorkloadRecoveryConfig.cs new file mode 100644 index 000000000000..a19dfaa5f5c4 --- /dev/null +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices.Backup/Cmdlets/Restore/GetAzureRmRecoveryServicesWorkloadRecoveryConfig.cs @@ -0,0 +1,105 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models; +using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ProviderModel; +using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties; +using Microsoft.Azure.Management.Internal.Resources.Utilities.Models; +using System; +using System.Collections.Generic; +using System.Management.Automation; +using ServiceClientModel = Microsoft.Azure.Management.RecoveryServices.Backup.Models; + +namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets +{ + /// + /// Restores an item using the recovery point provided within the recovery services vault + /// + [Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "RecoveryServicesWorkloadRecoveryConfig", + DefaultParameterSetName = AzureVMParameterSet, SupportsShouldProcess = true), OutputType(typeof(JobBase))] + public class GetAzureRmRecoveryServicesWorkloadRecoveryConfig : RSBackupVaultCmdletBase + { + internal const string AzureVMParameterSet = "AzureVMParameterSet"; + internal const string AzureFileParameterSet = "AzureFileParameterSet"; + + /// + /// Recovery point of the item to be restored + /// + [Parameter(Mandatory = false, ValueFromPipeline = true, Position = 0, + HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)] + [ValidateNotNullOrEmpty] + public RecoveryPointBase RecoveryPoint { get; set; } + + /// + /// End time of Time range for which recovery points need to be fetched + /// + [Parameter(Mandatory = false, ValueFromPipeline = false, Position = 1, + HelpMessage = ParamHelpMsgs.RecoveryPoint.EndDate)] + [ValidateNotNullOrEmpty] + public DateTime? PointInTime { get; set; } + + /// + /// Protected Item object for which recovery points need to be fetched + /// + [Parameter(Mandatory = true, ValueFromPipeline = false, Position = 2, + HelpMessage = ParamHelpMsgs.RecoveryPoint.Item)] + [ValidateNotNullOrEmpty] + public ItemBase Item { get; set; } + + /// + /// Use this switch if the disks from the recovery point are to be restored to their original storage accounts + /// + [Parameter(Mandatory = false, ParameterSetName = AzureVMParameterSet, + HelpMessage = ParamHelpMsgs.RestoreVM.OsaOption)] + public SwitchParameter OriginalWorkloadRestore { get; set; } + + public override void ExecuteCmdlet() + { + ExecutionBlock(() => + { + base.ExecuteCmdlet(); + + ResourceIdentifier resourceIdentifier = new ResourceIdentifier(VaultId); + string vaultName = resourceIdentifier.ResourceName; + string resourceGroupName = resourceIdentifier.ResourceGroupName; + Dictionary providerParameters = new Dictionary(); + + providerParameters.Add(VaultParams.VaultName, vaultName); + providerParameters.Add(VaultParams.ResourceGroupName, resourceGroupName); + providerParameters.Add(WorkloadRecoveryConfigParams.RecoveryPoint, RecoveryPoint); + providerParameters.Add(WorkloadRecoveryConfigParams.OriginalWorkloadRestore, OriginalWorkloadRestore.IsPresent); + providerParameters.Add(WorkloadRecoveryConfigParams.Item, Item); + providerParameters.Add(WorkloadRecoveryConfigParams.PointInTime, PointInTime); + + PsBackupProviderManager providerManager = + new PsBackupProviderManager(providerParameters, ServiceClientAdapter); + IPsBackupProvider psBackupProvider = providerManager.GetProviderInstance( + RecoveryPoint.WorkloadType, RecoveryPoint.BackupManagementType); + var jobResponse = psBackupProvider.TriggerRestore(); + + ServiceClientModel.AzureWorkloadRestoreRequest; + ServiceClientModel.AzureWorkloadSQLPointInTimeRestoreRequest; + ServiceClientModel.AzureWorkloadSQLRestoreRequest; + ServiceClientModel.AzureWorkloadSQLRecoveryPoint + + WriteDebug(string.Format("Restore submitted")); + HandleCreatedJob( + jobResponse, + Resources.RestoreOperation, + vaultName: vaultName, + resourceGroupName: resourceGroupName); + }, ShouldProcess(RecoveryPoint.ItemName, VerbsData.Restore)); + } + } +} diff --git a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices/Az.RecoveryServices.psd1 b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices/Az.RecoveryServices.psd1 index 3e71809e8fa6..f419de5b1c9a 100644 --- a/src/ResourceManager/RecoveryServices/Commands.RecoveryServices/Az.RecoveryServices.psd1 +++ b/src/ResourceManager/RecoveryServices/Commands.RecoveryServices/Az.RecoveryServices.psd1 @@ -170,7 +170,8 @@ CmdletsToExport = 'Get-AzRecoveryServicesBackupProperty', 'New-AzRecoveryServicesBackupProtectionPolicy', 'Remove-AzRecoveryServicesBackupProtectionPolicy', 'Set-AzRecoveryServicesBackupProtectionPolicy', - 'Get-AzRecoveryServicesBackupRecoveryPoint', + 'Get-AzRecoveryServicesBackupRecoveryPoint', + 'Get-AzRecoveryServicesBackupRecoveryLogChain', 'Restore-AzRecoveryServicesBackupItem', 'Unregister-AzRecoveryServicesBackupManagementServer', 'Get-AzRecoveryServicesBackupRPMountScript',