Skip to content

Commit 2d5322d

Browse files
hiagaCaptainFanZzz
andauthored
[Az.RecoveryServices.backup] Added support for TVM backup and Enhanced IaasVM policy (#17589)
* Added support for TVM backup and Enhanced IaasVM policy Masked Hourly policy Scenarios Updated help text Re-recorded failed tests Added TVM test case * resolved review comments * Updated help text Removed compute SDK part Co-authored-by: Yufan Yang <[email protected]>
1 parent 1d3d6d1 commit 2d5322d

File tree

70 files changed

+15596
-18647
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+15596
-18647
lines changed

src/RecoveryServices/RecoveryServices.Backup.Helpers/Conversions/ConversionHelpers.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public static List<BackupEngineBase> GetBackupEngineModelList(
138138
/// </summary>
139139
public static PolicyBase GetPolicyModelForAzureIaaSVM(ServiceClientModel.ProtectionPolicyResource serviceClientResponse,
140140
PolicyBase policyModel)
141-
{
141+
{
142142
string backupManagementType = Management.RecoveryServices.Backup.Models.BackupManagementType.AzureIaasVM;
143143
if (((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).RetentionPolicy.GetType() !=
144144
typeof(ServiceClientModel.LongTermRetentionPolicy))
@@ -149,34 +149,48 @@ public static PolicyBase GetPolicyModelForAzureIaaSVM(ServiceClientModel.Protect
149149
return null;
150150
}
151151

152-
if (((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).SchedulePolicy.GetType() !=
153-
typeof(ServiceClientModel.SimpleSchedulePolicy))
152+
Type schedulePolicyType = ((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).SchedulePolicy.GetType();
153+
if (schedulePolicyType != typeof(ServiceClientModel.SimpleSchedulePolicy) && schedulePolicyType != typeof(ServiceClientModel.SimpleSchedulePolicyV2))
154154
{
155-
Logger.Instance.WriteDebug("Unknown SchedulePolicy object received: " +
156-
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).SchedulePolicy.GetType());
155+
Logger.Instance.WriteDebug("Unknown SchedulePolicy object received: " + schedulePolicyType);
157156
Logger.Instance.WriteWarning(Resources.UpdateToNewAzurePowershellWarning);
158157
return null;
159158
}
160-
159+
161160
policyModel = new AzureVmPolicy();
162161
AzureVmPolicy iaasPolicyModel = policyModel as AzureVmPolicy;
163162
iaasPolicyModel.WorkloadType = WorkloadType.AzureVM;
164163
iaasPolicyModel.BackupManagementType = BackupManagementType.AzureVM;
165164
iaasPolicyModel.SnapshotRetentionInDays = ((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.
166165
Properties).InstantRpRetentionRangeInDays;
166+
167+
string policyType = ((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).PolicyType;
168+
iaasPolicyModel.PolicySubType = (policyType != null && policyType.ToLower().Contains("v2")) ? PSPolicyType.Enhanced : PSPolicyType.Standard;
167169
iaasPolicyModel.ProtectedItemsCount = ((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.
168170
Properties).ProtectedItemsCount;
169171
iaasPolicyModel.RetentionPolicy = PolicyHelpers.GetPSLongTermRetentionPolicy((ServiceClientModel.LongTermRetentionPolicy)
170172
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).RetentionPolicy,
171173
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).TimeZone,
172174
backupManagementType);
173-
iaasPolicyModel.SchedulePolicy = PolicyHelpers.GetPSSimpleSchedulePolicy((ServiceClientModel.SimpleSchedulePolicy)
175+
176+
if (schedulePolicyType == typeof(ServiceClientModel.SimpleSchedulePolicyV2))
177+
{
178+
iaasPolicyModel.SchedulePolicy = PolicyHelpers.GetPSSimpleSchedulePolicyV2((ServiceClientModel.SimpleSchedulePolicyV2)
174179
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).SchedulePolicy,
175180
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).TimeZone);
181+
}
182+
else
183+
{
184+
iaasPolicyModel.SchedulePolicy = PolicyHelpers.GetPSSimpleSchedulePolicy((ServiceClientModel.SimpleSchedulePolicy)
185+
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).SchedulePolicy,
186+
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).TimeZone);
187+
}
188+
176189
iaasPolicyModel.AzureBackupRGName =
177190
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).InstantRPDetails.AzureBackupRGNamePrefix;
178191
iaasPolicyModel.AzureBackupRGNameSuffix =
179192
((ServiceClientModel.AzureIaaSVMProtectionPolicy)serviceClientResponse.Properties).InstantRPDetails.AzureBackupRGNameSuffix;
193+
180194
return policyModel;
181195
}
182196

src/RecoveryServices/RecoveryServices.Backup.Helpers/Conversions/JobConversions.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ public static CmdletModel.JobBase GetPSJobCrr(CrrModel.JobResource serviceClient
9797
{
9898
response = GetPSAzureVaultJob(serviceClientJob); // add Crr if needed
9999
}*/
100+
else if (serviceClientJob.Properties.GetType() == typeof(CrrModel.Job))
101+
{
102+
response = GetPSAzureBaseJobCrr(serviceClientJob);
103+
}
100104

101105
return response;
102106
}
@@ -887,6 +891,26 @@ private static CmdletModel.AzureVmJob GetPSAzureVmJobCrr(CrrModel.JobResource se
887891
return response;
888892
}
889893

894+
/// <summary>
895+
/// Helper function to convert ps azure vm backup policy job from service response.
896+
/// </summary>
897+
private static CmdletModel.AzureJob GetPSAzureBaseJobCrr(CrrModel.JobResource serviceClientJob)
898+
{
899+
CrrModel.Job baseJob = serviceClientJob.Properties;
900+
CmdletModel.AzureJob response = new CmdletModel.AzureJob();
901+
902+
response.JobId = GetLastIdFromFullId(serviceClientJob.Id);
903+
response.StartTime = GetJobStartTime(baseJob.StartTime);
904+
response.EndTime = baseJob.EndTime;
905+
response.Status = baseJob.Status;
906+
response.WorkloadName = baseJob.EntityFriendlyName;
907+
response.ActivityId = baseJob.ActivityId;
908+
response.BackupManagementType = CmdletModel.ConversionUtils.GetPsBackupManagementType(baseJob.BackupManagementType);
909+
response.Operation = baseJob.Operation;
910+
911+
return response;
912+
}
913+
890914
/// <summary>
891915
/// Helper function to convert ps azure vm backup job error info from service response.
892916
/// </summary>

src/RecoveryServices/RecoveryServices.Backup.Helpers/Conversions/SchedulePolicyConversions.cs

Lines changed: 135 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,9 @@ public static SimpleSchedulePolicy GetPSSimpleSchedulePolicy(
4040

4141
SimpleSchedulePolicy psPolicy = new SimpleSchedulePolicy();
4242

43-
psPolicy.ScheduleRunDays =
44-
HelperUtils.EnumListConverter<ServiceClientModel.DayOfWeek?, DayOfWeek>(
45-
serviceClientPolicy.ScheduleRunDays);
46-
psPolicy.ScheduleRunFrequency = (ScheduleRunType)Enum.Parse(
47-
typeof(ScheduleRunType), serviceClientPolicy.ScheduleRunFrequency.ToString());
43+
psPolicy.ScheduleRunDays = HelperUtils.EnumListConverter<ServiceClientModel.DayOfWeek?, DayOfWeek>(serviceClientPolicy.ScheduleRunDays);
44+
45+
psPolicy.ScheduleRunFrequency = (ScheduleRunType)Enum.Parse(typeof(ScheduleRunType), serviceClientPolicy.ScheduleRunFrequency.ToString());
4846
psPolicy.ScheduleRunTimes = ParseDateTimesToUTC(serviceClientPolicy.ScheduleRunTimes, timeZone);
4947

5048
if (psPolicy.ScheduleRunFrequency == ScheduleRunType.Weekly)
@@ -82,23 +80,92 @@ public static SimpleSchedulePolicy GetPSSimpleSchedulePolicy(
8280
psPolicy.ScheduleWindowStartTime = serviceClientPolicy.HourlySchedule.ScheduleWindowStartTime;
8381
psPolicy.ScheduleWindowDuration = serviceClientPolicy.HourlySchedule.ScheduleWindowDuration;
8482
psPolicy.ScheduleRunTimeZone = timeZone;
85-
psPolicy.ScheduleRunDays = null;
86-
psPolicy.ScheduleRunTimes = null;
8783
}
8884
else
8985
{
90-
psPolicy.ScheduleInterval = null;
91-
psPolicy.ScheduleWindowStartTime = null;
92-
psPolicy.ScheduleWindowDuration = null;
9386
psPolicy.ScheduleRunTimeZone = timeZone;
9487
}
9588

9689
// safe side validation
97-
if (psPolicy.ScheduleRunFrequency != ScheduleRunType.Hourly)
90+
psPolicy.Validate();
91+
92+
return psPolicy;
93+
}
94+
95+
// <summary>
96+
/// Helper function to convert ps simple schedule policy from service response.
97+
/// </summary>
98+
public static SimpleSchedulePolicyV2 GetPSSimpleSchedulePolicyV2(
99+
ServiceClientModel.SimpleSchedulePolicyV2 serviceClientPolicy, string timeZone)
100+
{
101+
if (serviceClientPolicy == null)
98102
{
99-
psPolicy.Validate();
100-
}
103+
return null;
104+
}
101105

106+
SimpleSchedulePolicyV2 psPolicy = new SimpleSchedulePolicyV2();
107+
108+
psPolicy.ScheduleRunFrequency = (ScheduleRunType)Enum.Parse(typeof(ScheduleRunType), serviceClientPolicy.ScheduleRunFrequency.ToString());
109+
110+
if (psPolicy.ScheduleRunFrequency == ScheduleRunType.Weekly)
111+
{
112+
psPolicy.WeeklySchedule = new WeeklySchedule();
113+
114+
int offset = 0;
115+
if (serviceClientPolicy.WeeklySchedule != null)
116+
{
117+
psPolicy.WeeklySchedule.ScheduleRunDays = HelperUtils.EnumListConverter<ServiceClientModel.DayOfWeek?, DayOfWeek>(serviceClientPolicy.WeeklySchedule.ScheduleRunDays);
118+
psPolicy.WeeklySchedule.ScheduleRunTimes = ParseDateTimesToUTC(serviceClientPolicy.WeeklySchedule.ScheduleRunTimes, timeZone);
119+
120+
offset = psPolicy.WeeklySchedule.ScheduleRunTimes[0].DayOfWeek.GetHashCode() - serviceClientPolicy.WeeklySchedule.ScheduleRunTimes[0].Value.DayOfWeek.GetHashCode();
121+
}
122+
123+
for (int index = 0; index < psPolicy.WeeklySchedule.ScheduleRunDays.Count(); index++)
124+
{
125+
if (offset == -1)
126+
{
127+
int value = psPolicy.WeeklySchedule.ScheduleRunDays[index].GetHashCode() - 1;
128+
if (value == -1)
129+
{
130+
value = 6;
131+
}
132+
133+
psPolicy.WeeklySchedule.ScheduleRunDays[index] = (DayOfWeek)value;
134+
}
135+
else if (offset == 1)
136+
{
137+
int value = psPolicy.WeeklySchedule.ScheduleRunDays[index].GetHashCode() + 1;
138+
if (value == 7)
139+
{
140+
value = 0;
141+
}
142+
psPolicy.WeeklySchedule.ScheduleRunDays[index] = (DayOfWeek)value;
143+
}
144+
}
145+
}
146+
else if (psPolicy.ScheduleRunFrequency == ScheduleRunType.Hourly)
147+
{
148+
return null;
149+
150+
/* // Uncomment Hourly policy
151+
psPolicy.HourlySchedule = new HourlySchedule();
152+
153+
// multiple backups per day
154+
psPolicy.HourlySchedule.Interval = serviceClientPolicy.HourlySchedule.Interval;
155+
psPolicy.HourlySchedule.WindowStartTime = serviceClientPolicy.HourlySchedule.ScheduleWindowStartTime;
156+
psPolicy.HourlySchedule.WindowDuration = serviceClientPolicy.HourlySchedule.ScheduleWindowDuration; */
157+
}
158+
else
159+
{
160+
psPolicy.DailySchedule = new DailySchedule();
161+
psPolicy.DailySchedule.ScheduleRunTimes = (serviceClientPolicy.DailySchedule != null) ? ParseDateTimesToUTC(serviceClientPolicy.DailySchedule.ScheduleRunTimes, timeZone) : null;
162+
}
163+
164+
psPolicy.ScheduleRunTimeZone = timeZone;
165+
166+
// safe side validation
167+
psPolicy.Validate();
168+
102169
return psPolicy;
103170
}
104171

@@ -161,38 +228,72 @@ public static List<DateTime> ParseDateTimesToUTC(IList<DateTime?> localTimes, st
161228
// <summary>
162229
/// Helper function to convert service simple schedule policy from ps schedule policy.
163230
/// </summary>
164-
public static ServiceClientModel.SimpleSchedulePolicy GetServiceClientSimpleSchedulePolicy(
165-
SimpleSchedulePolicy psPolicy)
231+
public static ServiceClientModel.SchedulePolicy GetServiceClientSimpleSchedulePolicy(
232+
SchedulePolicyBase psPolicy)
166233
{
167234
if (psPolicy == null)
168235
{
169236
return null;
170237
}
171238

172-
ServiceClientModel.SimpleSchedulePolicy serviceClientPolicy = new ServiceClientModel.SimpleSchedulePolicy();
173-
serviceClientPolicy.ScheduleRunFrequency =
174-
ServiceClientHelpers.GetServiceClientScheduleRunType(
175-
psPolicy.ScheduleRunFrequency);
176-
177-
if (psPolicy.ScheduleRunFrequency == ScheduleRunType.Weekly)
239+
if (psPolicy.GetType() == typeof(SimpleSchedulePolicy))
178240
{
179-
serviceClientPolicy.ScheduleRunDays =
180-
HelperUtils.EnumListConverter<DayOfWeek, ServiceClientModel.DayOfWeek>(
181-
psPolicy.ScheduleRunDays).Cast<ServiceClientModel.DayOfWeek?>().ToList();
182-
}
241+
SimpleSchedulePolicy schPolicy = (SimpleSchedulePolicy)psPolicy;
242+
ServiceClientModel.SimpleSchedulePolicy serviceClientPolicy = new ServiceClientModel.SimpleSchedulePolicy();
183243

184-
if (psPolicy.ScheduleRunFrequency != ScheduleRunType.Hourly)
185-
{
186-
serviceClientPolicy.ScheduleRunTimes = psPolicy.ScheduleRunTimes.ConvertAll(dateTime => (DateTime?)dateTime);
244+
serviceClientPolicy.ScheduleRunFrequency = ServiceClientHelpers.GetServiceClientScheduleRunType(schPolicy.ScheduleRunFrequency);
245+
246+
if (schPolicy.ScheduleRunFrequency == ScheduleRunType.Weekly)
247+
{
248+
serviceClientPolicy.ScheduleRunDays = HelperUtils.EnumListConverter<DayOfWeek, ServiceClientModel.DayOfWeek>(
249+
schPolicy.ScheduleRunDays).Cast<ServiceClientModel.DayOfWeek?>().ToList();
250+
}
251+
252+
if (schPolicy.ScheduleRunFrequency != ScheduleRunType.Hourly)
253+
{
254+
serviceClientPolicy.ScheduleRunTimes = schPolicy.ScheduleRunTimes.ConvertAll(dateTime => (DateTime?)dateTime);
255+
}
256+
else
257+
{
258+
serviceClientPolicy.HourlySchedule = new ServiceClientModel.HourlySchedule();
259+
serviceClientPolicy.HourlySchedule.Interval = schPolicy.ScheduleInterval;
260+
serviceClientPolicy.HourlySchedule.ScheduleWindowDuration = schPolicy.ScheduleWindowDuration;
261+
serviceClientPolicy.HourlySchedule.ScheduleWindowStartTime = schPolicy.ScheduleWindowStartTime;
262+
}
263+
return serviceClientPolicy;
187264
}
188-
else
265+
266+
else if (psPolicy.GetType() == typeof(SimpleSchedulePolicyV2))
189267
{
190-
serviceClientPolicy.HourlySchedule = new ServiceClientModel.HourlySchedule();
191-
serviceClientPolicy.HourlySchedule.Interval = psPolicy.ScheduleInterval;
192-
serviceClientPolicy.HourlySchedule.ScheduleWindowDuration = psPolicy.ScheduleWindowDuration;
193-
serviceClientPolicy.HourlySchedule.ScheduleWindowStartTime = psPolicy.ScheduleWindowStartTime;
268+
SimpleSchedulePolicyV2 schPolicyV2 = (SimpleSchedulePolicyV2)psPolicy;
269+
ServiceClientModel.SimpleSchedulePolicyV2 serviceClientPolicyV2 = new ServiceClientModel.SimpleSchedulePolicyV2();
270+
271+
serviceClientPolicyV2.ScheduleRunFrequency = ServiceClientHelpers.GetServiceClientScheduleRunType(schPolicyV2.ScheduleRunFrequency);
272+
273+
if (schPolicyV2.ScheduleRunFrequency == ScheduleRunType.Weekly)
274+
{
275+
serviceClientPolicyV2.WeeklySchedule = new ServiceClientModel.WeeklySchedule();
276+
serviceClientPolicyV2.WeeklySchedule.ScheduleRunDays = HelperUtils.EnumListConverter<DayOfWeek, ServiceClientModel.DayOfWeek>(
277+
schPolicyV2.WeeklySchedule.ScheduleRunDays).Cast<ServiceClientModel.DayOfWeek?>().ToList();
278+
279+
serviceClientPolicyV2.WeeklySchedule.ScheduleRunTimes = schPolicyV2.WeeklySchedule.ScheduleRunTimes.ConvertAll(dateTime => (DateTime?)dateTime);
280+
}
281+
else if (schPolicyV2.ScheduleRunFrequency == ScheduleRunType.Daily)
282+
{
283+
serviceClientPolicyV2.DailySchedule = new ServiceClientModel.DailySchedule();
284+
serviceClientPolicyV2.DailySchedule.ScheduleRunTimes = schPolicyV2.DailySchedule.ScheduleRunTimes.ConvertAll(dateTime => (DateTime?)dateTime);
285+
}
286+
else if(schPolicyV2.ScheduleRunFrequency == ScheduleRunType.Hourly)
287+
{
288+
serviceClientPolicyV2.HourlySchedule = new ServiceClientModel.HourlySchedule();
289+
serviceClientPolicyV2.HourlySchedule.Interval = schPolicyV2.HourlySchedule.Interval;
290+
serviceClientPolicyV2.HourlySchedule.ScheduleWindowDuration = schPolicyV2.HourlySchedule.WindowDuration;
291+
serviceClientPolicyV2.HourlySchedule.ScheduleWindowStartTime = schPolicyV2.HourlySchedule.WindowStartTime;
292+
}
293+
return serviceClientPolicyV2;
194294
}
195-
return serviceClientPolicy;
295+
296+
return null;
196297
}
197298

198299
public static ServiceClientModel.LogSchedulePolicy GetServiceClientLogSchedulePolicy(

src/RecoveryServices/RecoveryServices.Backup.Helpers/HelperUtils.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,24 @@ public static string GetResourceGroupNameFromId(
274274
return resourceGroupName;
275275
}
276276

277+
public static string GetVMNameFromId(Dictionary<CmdletModel.UriEnums, string> keyValuePairs,
278+
string id)
279+
{
280+
string virtualMachineName = string.Empty;
281+
282+
if (keyValuePairs.ContainsKey(CmdletModel.UriEnums.VirtualMachines))
283+
{
284+
virtualMachineName = keyValuePairs[CmdletModel.UriEnums.VirtualMachines];
285+
}
286+
else
287+
{
288+
throw new ArgumentException(string.Format(Resources.URIValueNotFound,
289+
CmdletModel.UriEnums.VirtualMachines.ToString(), id));
290+
}
291+
292+
return virtualMachineName;
293+
}
294+
277295
public static string GetVaultNameFromId(
278296
Dictionary<CmdletModel.UriEnums, string> keyValuePairs,
279297
string id)

0 commit comments

Comments
 (0)