Skip to content

Commit 482b8fd

Browse files
committed
Added restore support for mercury
1 parent 012860a commit 482b8fd

File tree

7 files changed

+282
-13
lines changed

7 files changed

+282
-13
lines changed

src/RecoveryServices/RecoveryServices.Backup.Models/BaseObjects.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
// limitations under the License.
1313
// ----------------------------------------------------------------------------------
1414

15+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
1516
using System;
1617
using System.Collections.Generic;
17-
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
1818
using ServiceClientModel = Microsoft.Azure.Management.RecoveryServices.Backup.Models;
1919

2020
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models
@@ -389,4 +389,30 @@ public class JobSubTaskBase
389389
/// </summary>
390390
public string Status { get; set; }
391391
}
392+
393+
/// <summary>
394+
/// This class contains recovery config detail.
395+
/// </summary>
396+
public class RecoveryConfigBase
397+
{
398+
/// <summary>
399+
/// source resource id.
400+
/// </summary>
401+
public string SourceResourceId { get; set; }
402+
403+
/// <summary>
404+
/// Original WL Restore, Alternate WL restore, Alternate WL restore to diff item.
405+
/// </summary>
406+
public string RestoreRequestType { get; set; }
407+
408+
/// <summary>
409+
/// Recovery point for full/differential backup.
410+
/// </summary>
411+
public AzureRecoveryPoint RecoveryPoint { get; set; }
412+
413+
/// <summary>
414+
/// PointInTime for Log backup.
415+
/// </summary>
416+
public DateTime PointInTime { get; set; }
417+
}
392418
}

src/RecoveryServices/RecoveryServices.Backup.Models/CmdletParamEnums.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,20 @@ public enum RestoreFSBackupItemParams
7070
TargetFileShareName,
7171
TargetFolder
7272
}
73+
public enum RestoreWLBackupItemParams
74+
{
75+
WLRecoveryConfig
76+
}
77+
78+
public enum WorkloadRecoveryConfigParams
79+
{
80+
PointInTime,
81+
RecoveryPoint,
82+
OriginalWorkloadRestore,
83+
AlternateWorkloadRestore,
84+
Item,
85+
TargetItem
86+
}
7387

7488
public enum PolicyParams
7589
{

src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
using System.Collections.Generic;
2020
using CmdletModel = Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models;
2121
using RestAzureNS = Microsoft.Rest.Azure;
22+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
23+
using ServiceClientModel = Microsoft.Azure.Management.RecoveryServices.Backup.Models;
24+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
2225

2326
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ProviderModel
2427
{
@@ -84,7 +87,7 @@ public ProtectedItemResource GetProtectedItem()
8487

8588
public RecoveryPointBase GetRecoveryPointDetails()
8689
{
87-
return AzureWorkloadProviderHelper.GetRecoveryPointDetails(ProviderData);
90+
throw new NotImplementedException();
8891
}
8992

9093
public List<CmdletModel.BackupEngineBase> ListBackupManagementServers()
@@ -104,7 +107,7 @@ public List<ContainerBase> ListProtectionContainers()
104107

105108
public List<RecoveryPointBase> ListRecoveryPoints()
106109
{
107-
return AzureWorkloadProviderHelper.ListRecoveryPoints(ProviderData);
110+
throw new NotImplementedException();
108111
}
109112

110113
public RestAzureNS.AzureOperationResponse<ProtectionPolicyResource> ModifyPolicy()
@@ -131,10 +134,5 @@ public RestAzureNS.AzureOperationResponse TriggerRestore()
131134
{
132135
throw new NotImplementedException();
133136
}
134-
135-
public List<PointInTimeRange> GetLogChains()
136-
{
137-
return AzureWorkloadProviderHelper.ListLogChains(ProviderData);
138-
}
139137
}
140138
}

src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Restore/RestoreAzureRMRecoveryServicesBackupItem.cs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
3232
{
3333
internal const string AzureVMParameterSet = "AzureVMParameterSet";
3434
internal const string AzureFileParameterSet = "AzureFileParameterSet";
35+
internal const string AzureWorkloadParameterSet = "AzureWorkloadParameterSet";
3536

3637
/// <summary>
3738
/// Location of the Recovery Services Vault.
@@ -46,10 +47,20 @@ public class RestoreAzureRmRecoveryServicesBackupItem : RSBackupVaultCmdletBase
4647
/// Recovery point of the item to be restored
4748
/// </summary>
4849
[Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0,
49-
HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
50+
ParameterSetName = AzureVMParameterSet, HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
51+
[Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0,
52+
ParameterSetName = AzureFileParameterSet, HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
5053
[ValidateNotNullOrEmpty]
5154
public RecoveryPointBase RecoveryPoint { get; set; }
5255

56+
/// <summary>
57+
/// Recovery point of the item to be restored
58+
/// </summary>
59+
[Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0,
60+
ParameterSetName = AzureWorkloadParameterSet, HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
61+
[ValidateNotNullOrEmpty]
62+
public RecoveryConfigBase WLRecoveryConfig { get; set; }
63+
5364
/// <summary>
5465
/// Storage account name where the disks need to be recovered
5566
/// </summary>
@@ -150,7 +161,7 @@ public override void ExecuteCmdlet()
150161
providerParameters.Add(RestoreFSBackupItemParams.TargetStorageAccountName, TargetStorageAccountName);
151162
providerParameters.Add(RestoreFSBackupItemParams.TargetFileShareName, TargetFileShareName);
152163
providerParameters.Add(RestoreFSBackupItemParams.TargetFolder, TargetFolder);
153-
164+
providerParameters.Add(RestoreWLBackupItemParams.WLRecoveryConfig, WLRecoveryConfig);
154165
if (StorageAccountName != null)
155166
{
156167
providerParameters.Add(RestoreBackupItemParams.StorageAccountName, StorageAccountName);
@@ -173,10 +184,18 @@ public override void ExecuteCmdlet()
173184

174185
PsBackupProviderManager providerManager =
175186
new PsBackupProviderManager(providerParameters, ServiceClientAdapter);
176-
IPsBackupProvider psBackupProvider = providerManager.GetProviderInstance(
177-
RecoveryPoint.WorkloadType, RecoveryPoint.BackupManagementType);
187+
IPsBackupProvider psBackupProvider = null;
188+
if (string.Compare(ParameterSetName, AzureWorkloadParameterSet) != 0)
189+
{
190+
psBackupProvider = providerManager.GetProviderInstance(
191+
RecoveryPoint.WorkloadType, RecoveryPoint.BackupManagementType);
192+
}
193+
else
194+
{
195+
psBackupProvider = providerManager.GetProviderInstance(
196+
WorkloadType.MSSQL, BackupManagementType.AzureWorkload);
197+
}
178198
var jobResponse = psBackupProvider.TriggerRestore();
179-
180199
WriteDebug(string.Format("Restore submitted"));
181200
HandleCreatedJob(
182201
jobResponse,

src/RecoveryServices/RecoveryServices.Backup/ParamHelpMsgs.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ internal static class RestoreDisk
111111
public const string RecoveryPoint = "Recovery point object to be restored";
112112
public const string StorageAccountName = "Storage account name where the disks need to be recovered";
113113
public const string StorageAccountResourceGroupName = "Resource group name of Storage account name where the disks need to be recovered";
114+
public const string RecoveryConfig = "Recovery config";
114115
}
115116

116117
internal static class RestoreVM
@@ -138,5 +139,13 @@ internal static class ProtectionCheck
138139
public const string ResourceId = "ID of the Azure Resource whose representative item needs to be checked if it is already protected by some RecoveryServices Vault in the subscription.";
139140
public const string ProtectableObjName = "Name of the Azure Resource whose representative item needs to be checked if it is already protected by some Recovery Services Vault in the subscription.";
140141
}
142+
143+
internal static class RecoveryPointConfig
144+
{
145+
public const string Item = "Item";
146+
public const string TargetItem = "TargetItem";
147+
public const string OriginalWorkloadRestore = "OriginalWorkloadRestore";
148+
public const string AlternateWorkloadRestore = "AlternateWorkloadRestore";
149+
}
141150
}
142151
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// ----------------------------------------------------------------------------------
2+
//
3+
// Copyright Microsoft Corporation
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
// ----------------------------------------------------------------------------------
14+
15+
using Microsoft.Azure.Management.RecoveryServices.Backup.Models;
16+
using System;
17+
using System.Collections.Generic;
18+
19+
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models
20+
{
21+
/// <summary>
22+
/// Recovery config of a resource.
23+
/// </summary>
24+
public class AzureWorkloadRecoveryConfig : RecoveryConfigBase
25+
{
26+
/// <summary>
27+
/// Target Server
28+
/// </summary>
29+
public string TargetServer { get; set; }
30+
31+
/// <summary>
32+
/// Target Instance
33+
/// </summary>
34+
public string TargetInstance { get; set; }
35+
36+
/// <summary>
37+
/// Restored DB Name
38+
/// </summary>
39+
public string RestoredDBName { get; set; }
40+
41+
/// <summary>
42+
/// OverwriteWLIfpresent
43+
/// </summary>
44+
public string OverwriteWLIfpresent { get; set; }
45+
46+
/// <summary>
47+
/// NoRecoveryMode
48+
/// </summary>
49+
public string NoRecoveryMode { get; set; }
50+
51+
/// <summary>
52+
/// targetPhysicalPath
53+
/// </summary>
54+
public IList<SQLDataDirectoryMapping> targetPhysicalPath { get; set; }
55+
56+
public AzureWorkloadRecoveryConfig()
57+
{
58+
}
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
// ----------------------------------------------------------------------------------
2+
//
3+
// Copyright Microsoft Corporation
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
// ----------------------------------------------------------------------------------
14+
15+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models;
16+
using Microsoft.Azure.Management.Internal.Resources.Utilities.Models;
17+
using System;
18+
using System.Collections.Generic;
19+
using System.Management.Automation;
20+
21+
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
22+
{
23+
/// <summary>
24+
/// Restores an item using the recovery point provided within the recovery services vault
25+
/// </summary>
26+
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "RecoveryServicesWorkloadRecoveryConfig",
27+
DefaultParameterSetName = RpParameterSet, SupportsShouldProcess = true), OutputType(typeof(AzureWorkloadRecoveryConfig))]
28+
public class GetAzureRmRecoveryServicesWorkloadRecoveryConfig : RSBackupVaultCmdletBase
29+
{
30+
internal const string RpParameterSet = "AzureVMParameterSet";
31+
internal const string LogChainParameterSet = "AzureFileParameterSet";
32+
33+
/// <summary>
34+
/// Recovery point of the item to be restored
35+
/// </summary>
36+
[Parameter(Mandatory = false, ValueFromPipeline = true, Position = 0,
37+
ParameterSetName = RpParameterSet, HelpMessage = ParamHelpMsgs.RestoreDisk.RecoveryPoint)]
38+
[ValidateNotNullOrEmpty]
39+
public RecoveryPointBase RecoveryPoint { get; set; }
40+
41+
/// <summary>
42+
/// End time of Time range for which recovery points need to be fetched
43+
/// </summary>
44+
[Parameter(Mandatory = false, ValueFromPipeline = false, Position = 0,
45+
ParameterSetName = LogChainParameterSet, HelpMessage = ParamHelpMsgs.RecoveryPoint.EndDate)]
46+
[ValidateNotNullOrEmpty]
47+
public DateTime PointInTime { get; set; }
48+
49+
/// <summary>
50+
/// Protected Item object for which recovery points need to be fetched
51+
/// </summary>
52+
[Parameter(Mandatory = false, ValueFromPipeline = false, Position = 1,
53+
HelpMessage = ParamHelpMsgs.RecoveryPointConfig.TargetItem)]
54+
[ValidateNotNullOrEmpty]
55+
public ItemBase TargetItem { get; set; }
56+
57+
/// <summary>
58+
/// Protected Item object for which recovery points need to be fetched
59+
/// </summary>
60+
[Parameter(Mandatory = true, ValueFromPipeline = false, Position = 2,
61+
HelpMessage = ParamHelpMsgs.RecoveryPointConfig.Item)]
62+
[ValidateNotNullOrEmpty]
63+
public ItemBase Item { get; set; }
64+
65+
/// <summary>
66+
/// Use this switch if the disks from the recovery point are to be restored to their original storage accounts
67+
/// </summary>
68+
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.RecoveryPointConfig.OriginalWorkloadRestore)]
69+
public SwitchParameter OriginalWorkloadRestore { get; set; }
70+
71+
/// <summary>
72+
/// Use this switch if the disks from the recovery point are to be restored to their original storage accounts
73+
/// </summary>
74+
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.RecoveryPointConfig.AlternateWorkloadRestore)]
75+
public SwitchParameter AlternateWorkloadRestore { get; set; }
76+
77+
public override void ExecuteCmdlet()
78+
{
79+
ExecutionBlock(() =>
80+
{
81+
base.ExecuteCmdlet();
82+
83+
ResourceIdentifier resourceIdentifier = new ResourceIdentifier(VaultId);
84+
string vaultName = resourceIdentifier.ResourceName;
85+
string resourceGroupName = resourceIdentifier.ResourceGroupName;
86+
Dictionary<Enum, object> providerParameters = new Dictionary<Enum, object>();
87+
88+
providerParameters.Add(VaultParams.VaultName, vaultName);
89+
providerParameters.Add(VaultParams.ResourceGroupName, resourceGroupName);
90+
providerParameters.Add(WorkloadRecoveryConfigParams.RecoveryPoint, RecoveryPoint);
91+
providerParameters.Add(WorkloadRecoveryConfigParams.OriginalWorkloadRestore, OriginalWorkloadRestore.IsPresent);
92+
providerParameters.Add(WorkloadRecoveryConfigParams.AlternateWorkloadRestore, OriginalWorkloadRestore.IsPresent);
93+
providerParameters.Add(WorkloadRecoveryConfigParams.Item, Item);
94+
providerParameters.Add(WorkloadRecoveryConfigParams.TargetItem, TargetItem);
95+
providerParameters.Add(WorkloadRecoveryConfigParams.PointInTime, PointInTime);
96+
97+
AzureWorkloadRecoveryConfig azureWorkloadRecoveryConfig = new AzureWorkloadRecoveryConfig();
98+
azureWorkloadRecoveryConfig.SourceResourceId = Item.SourceResourceId;
99+
if (ParameterSetName == RpParameterSet)
100+
{
101+
azureWorkloadRecoveryConfig.RecoveryPoint = RecoveryPoint;
102+
}
103+
else
104+
{
105+
azureWorkloadRecoveryConfig.PointInTime = PointInTime;
106+
}
107+
if (OriginalWorkloadRestore.IsPresent)
108+
{
109+
azureWorkloadRecoveryConfig.RestoreRequestType = "Original WL Restore";
110+
azureWorkloadRecoveryConfig.TargetServer = null;
111+
azureWorkloadRecoveryConfig.TargetInstance = null;
112+
azureWorkloadRecoveryConfig.RestoredDBName = Item.Name;
113+
azureWorkloadRecoveryConfig.OverwriteWLIfpresent = "No";
114+
azureWorkloadRecoveryConfig.NoRecoveryMode = "Disabled";
115+
}
116+
else if (AlternateWorkloadRestore.IsPresent)
117+
{
118+
azureWorkloadRecoveryConfig.RestoreRequestType = "Alternate WL Restore";
119+
azureWorkloadRecoveryConfig.TargetServer = null;
120+
//to do
121+
azureWorkloadRecoveryConfig.TargetInstance = null;
122+
123+
azureWorkloadRecoveryConfig.RestoredDBName = Item.Name + "_restored_" + DateTime.Now.ToUniversalTime().ToString();
124+
azureWorkloadRecoveryConfig.OverwriteWLIfpresent = "No";
125+
azureWorkloadRecoveryConfig.NoRecoveryMode = "Disabled";
126+
}
127+
else if (Item != null && TargetItem != null)
128+
{
129+
azureWorkloadRecoveryConfig.RestoreRequestType = "Alternate WL Restore to diff item";
130+
//todo
131+
azureWorkloadRecoveryConfig.TargetServer = null;
132+
azureWorkloadRecoveryConfig.TargetInstance = null;
133+
134+
azureWorkloadRecoveryConfig.RestoredDBName = Item.Name + "_restored_" + DateTime.Now.ToUniversalTime().ToString();
135+
azureWorkloadRecoveryConfig.OverwriteWLIfpresent = "No";
136+
azureWorkloadRecoveryConfig.NoRecoveryMode = "Disabled";
137+
}
138+
WriteObject(azureWorkloadRecoveryConfig);
139+
});
140+
}
141+
}
142+
}
143+

0 commit comments

Comments
 (0)