Skip to content

Commit 6dbea73

Browse files
1) Fix for bug 6635655 2) Purge Protection support
1 parent bd405a7 commit 6dbea73

File tree

8 files changed

+80
-46
lines changed

8 files changed

+80
-46
lines changed

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/Common/PSSiteRecoveryReplicationProtectedItemsClient.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,23 @@ public LongRunningOperationResponse DisableProtection(string fabricName,
128128
this.GetRequestHeaders());
129129
}
130130

131+
/// <summary>
132+
/// Purges Replicated Protected Item.
133+
/// </summary>
134+
/// <param name="protectionContainerName">Protection Container ID</param>
135+
/// <param name="replicationProtectedItemName">Virtual Machine ID or Replication group Id</param>
136+
/// <returns>Job response</returns>
137+
public LongRunningOperationResponse PurgeProtection(string fabricName,
138+
string protectionContainerName,
139+
string replicationProtectedItemName)
140+
{
141+
return this.GetSiteRecoveryClient().ReplicationProtectedItem.BeginPurgeProtection(
142+
fabricName,
143+
protectionContainerName,
144+
replicationProtectedItemName,
145+
this.GetRequestHeaders());
146+
}
147+
131148
/// <summary>
132149
/// Starts Planned Failover
133150
/// </summary>

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/Models/PSRecoveryPlanObjects.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public ASRRecoveryPlanGroup(RecoveryPlanGroup recoveryPlanGroup, IList<Replicati
4141
var replicationProtectedItemList = recoveryPlanGroup.ReplicationProtectedItems.Select(item => item.Id.ToLower());
4242
this.ReplicationProtectedItems = replicationProtectedItems.Where(rpi => replicationProtectedItemList.Contains(rpi.Id.ToLower())).ToList();
4343
}
44+
else
45+
{
46+
this.ReplicationProtectedItems = new List<ReplicationProtectedItem>();
47+
}
4448
}
4549
}
4650

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/Properties/Resources.Designer.cs

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/Properties/Resources.resx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,9 +326,9 @@ Please provide a storage account with the same location as that of the vault.</v
326326
<value>Group "{0}" not found for recovery plan "{1}"</value>
327327
</data>
328328
<data name="VMAlreadyPartOfGroup" xml:space="preserve">
329-
<value>Virtual Machine "{0}" is already part of Group "{1}" for recovery plan "{1}"</value>
329+
<value>Virtual Machine "{0}" is already part of Group "{1}" for recovery plan "{2}"</value>
330330
</data>
331331
<data name="VMNotFoundInGroup" xml:space="preserve">
332-
<value>Virtual Machine "{0}" not found in Group "{1}" for recovery plan "{1}"</value>
332+
<value>Virtual Machine "{0}" not found in Group "{1}" for recovery plan "{2}"</value>
333333
</data>
334334
</root>

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/ProtectionEntity/SetAzureSiteRecoveryProtectionEntity.cs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -219,24 +219,36 @@ public override void ExecuteSiteRecoveryCmdlet()
219219
}
220220
else
221221
{
222-
DisableProtectionInput input = new DisableProtectionInput();
223-
input.Properties = new DisableProtectionInputProperties()
224-
{
225-
ProviderSettings = new DisableProtectionProviderSpecificInput()
226-
};
227-
228222
// fetch the latest PE object
229223
ProtectableItemResponse protectableItemResponse =
230224
RecoveryServicesClient.GetAzureSiteRecoveryProtectableItem(Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics),
231225
this.ProtectionEntity.ProtectionContainerId, this.ProtectionEntity.Name);
232226
ProtectableItem protectableItem = protectableItemResponse.ProtectableItem;
233227

234-
this.response =
235-
RecoveryServicesClient.DisableProtection(
236-
Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics),
237-
Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationProtectionContainers),
238-
Utilities.GetValueFromArmId(protectableItem.Properties.ReplicationProtectedItemId, ARMResourceTypeConstants.ReplicationProtectedItems),
239-
input);
228+
if (!this.Force.IsPresent)
229+
{
230+
DisableProtectionInput input = new DisableProtectionInput();
231+
input.Properties = new DisableProtectionInputProperties()
232+
{
233+
ProviderSettings = new DisableProtectionProviderSpecificInput()
234+
};
235+
236+
this.response =
237+
RecoveryServicesClient.DisableProtection(
238+
Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics),
239+
Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationProtectionContainers),
240+
Utilities.GetValueFromArmId(protectableItem.Properties.ReplicationProtectedItemId, ARMResourceTypeConstants.ReplicationProtectedItems),
241+
input);
242+
}
243+
else
244+
{
245+
this.response =
246+
RecoveryServicesClient.PurgeProtection(
247+
Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationFabrics),
248+
Utilities.GetValueFromArmId(this.ProtectionEntity.ID, ARMResourceTypeConstants.ReplicationProtectionContainers),
249+
Utilities.GetValueFromArmId(protectableItem.Properties.ReplicationProtectedItemId, ARMResourceTypeConstants.ReplicationProtectedItems)
250+
);
251+
}
240252
}
241253

242254
jobResponse =

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/RecoveryPlan/EditAzureSiteRecoveryRecoveryPlan.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public override void ExecuteSiteRecoveryCmdlet()
9494
this.RecoveryPlan.Groups.Add(new ASRRecoveryPlanGroup("Group " + (RecoveryPlan.Groups.Count - 1).ToString(), recoveryPlanGroup));
9595
break;
9696
case ASRParameterSets.RemoveGroup:
97-
tempGroup = this.RecoveryPlan.Groups.FirstOrDefault(g => String.CompareOrdinal(g.Name, RemoveGroup.Name) == 0);
97+
tempGroup = this.RecoveryPlan.Groups.FirstOrDefault(g => String.Compare(g.Name, RemoveGroup.Name, StringComparison.OrdinalIgnoreCase) == 0);
9898

9999
if (tempGroup != null)
100100
{
@@ -127,7 +127,10 @@ public override void ExecuteSiteRecoveryCmdlet()
127127
{
128128
foreach (ASRRecoveryPlanGroup gp in this.RecoveryPlan.Groups)
129129
{
130-
if(gp.ReplicationProtectedItems.Any(pi => String.CompareOrdinal(pi.Id, replicationProtectedItemResponse.ReplicationProtectedItem.Id) == 0))
130+
if (gp.ReplicationProtectedItems == null)
131+
continue;
132+
133+
if (gp.ReplicationProtectedItems.Any(pi => String.Compare(pi.Id, replicationProtectedItemResponse.ReplicationProtectedItem.Id, StringComparison.OrdinalIgnoreCase) == 0))
131134
{
132135
throw new PSArgumentException(string.Format(Properties.Resources.VMAlreadyPartOfGroup, pe.FriendlyName, gp.Name, this.RecoveryPlan.FriendlyName));
133136
}
@@ -150,18 +153,16 @@ public override void ExecuteSiteRecoveryCmdlet()
150153
RecoveryServicesClient.GetAzureSiteRecoveryProtectableItem(fabricName,
151154
pe.ProtectionContainerId, pe.Name);
152155

153-
ReplicationProtectedItemResponse replicationProtectedItemResponse =
154-
RecoveryServicesClient.GetAzureSiteRecoveryReplicationProtectedItem(fabricName,
155-
pe.ProtectionContainerId, Utilities.GetValueFromArmId(protectableItemResponse.ProtectableItem.Properties.ReplicationProtectedItemId,
156-
ARMResourceTypeConstants.ReplicationProtectedItems));
157-
158156
tempGroup = this.RecoveryPlan.Groups.FirstOrDefault(g => String.Compare(g.Name, Group.Name, StringComparison.OrdinalIgnoreCase) == 0);
159157

160158
if (tempGroup != null)
161159
{
162160
var ReplicationProtectedItem =
163-
this.RecoveryPlan.Groups[RecoveryPlan.Groups.IndexOf(tempGroup)].ReplicationProtectedItems.
164-
FirstOrDefault(pi => String.CompareOrdinal(pi.Id, replicationProtectedItemResponse.ReplicationProtectedItem.Id) == 0);
161+
this.RecoveryPlan.Groups[RecoveryPlan.Groups.IndexOf(tempGroup)].
162+
ReplicationProtectedItems.
163+
FirstOrDefault(pi => String.Compare(pi.Id,
164+
protectableItemResponse.ProtectableItem.Properties.ReplicationProtectedItemId,
165+
StringComparison.OrdinalIgnoreCase) == 0);
165166

166167
if (ReplicationProtectedItem != null)
167168
{

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/RecoveryPlan/NewAzureSiteRecoveryRecoveryPlan.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,14 @@ private void CreateRecoveryPlan()
201201

202202
string VmId = null;
203203

204-
switch (replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails.InstanceType)
204+
if(replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplicaAzureReplicationDetails))
205+
{
206+
VmId = ((HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails).VmId;
207+
}
208+
else if(replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplica2012ReplicationDetails))
205209
{
206-
case Constants.HyperVReplicaAzureReplicationDetails:
207-
VmId = ((HyperVReplicaAzureReplicationDetails)replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails).VmId;
208-
break;
209-
210-
case Constants.HyperVReplica2012ReplicationDetails:
211-
VmId = ((HyperVReplica2012ReplicationDetails)replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails).VmId;
212-
break;
213-
};
210+
VmId = ((HyperVReplica2012ReplicationDetails)replicationProtectedItemResponse.ReplicationProtectedItem.Properties.ProviderSpecificDetails).VmId;
211+
}
214212

215213
RecoveryPlanProtectedItem recoveryPlanProtectedItem = new RecoveryPlanProtectedItem();
216214
recoveryPlanProtectedItem.Id = replicationProtectedItemResponse.ReplicationProtectedItem.Id;

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/RecoveryPlan/UpdateAzureSiteRecoveryRecoveryPlan.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,22 +94,24 @@ private void UpdateRecoveryPlan(ASRRecoveryPlan asrRecoveryPlan)
9494
RecoveryPlanGroup recoveryPlanGroup = new RecoveryPlanGroup()
9595
{
9696
GroupType = asrRecoveryPlanGroup.GroupType,
97-
ReplicationProtectedItems = asrRecoveryPlanGroup.ReplicationProtectedItems.Select(item =>
98-
{
97+
98+
// Initialize ReplicationProtectedItems with empty List if asrRecoveryPlanGroup.ReplicationProtectedItems is null
99+
// otherwise assign respective values
100+
ReplicationProtectedItems = asrRecoveryPlanGroup.ReplicationProtectedItems == null ? new List<RecoveryPlanProtectedItem>() :
101+
asrRecoveryPlanGroup.ReplicationProtectedItems.Select(item =>
102+
{
99103
var newItem = new RecoveryPlanProtectedItem(item.Id);
100104

101105
string VmId = null;
102106

103-
switch (item.Properties.ProviderSpecificDetails.InstanceType)
107+
if (item.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplicaAzureReplicationDetails))
104108
{
105-
case Constants.HyperVReplicaAzureReplicationDetails:
106-
VmId = ((HyperVReplicaAzureReplicationDetails)item.Properties.ProviderSpecificDetails).VmId;
107-
break;
108-
109-
case Constants.HyperVReplica2012ReplicationDetails:
110-
VmId = ((HyperVReplica2012ReplicationDetails)item.Properties.ProviderSpecificDetails).VmId;
111-
break;
112-
};
109+
VmId = ((HyperVReplicaAzureReplicationDetails)item.Properties.ProviderSpecificDetails).VmId;
110+
}
111+
else if (item.Properties.ProviderSpecificDetails.GetType() == typeof(HyperVReplica2012ReplicationDetails))
112+
{
113+
VmId = ((HyperVReplica2012ReplicationDetails)item.Properties.ProviderSpecificDetails).VmId;
114+
}
113115

114116
newItem.VirtualMachineId = VmId;
115117

@@ -163,6 +165,6 @@ private void UpdateRecoveryPlan(string recoveryPlanName, UpdateRecoveryPlanInput
163165

164166
WriteObject(new ASRJob(jobResponse.Job));
165167
}
166-
168+
167169
}
168170
}

0 commit comments

Comments
 (0)