Skip to content

Commit da84e89

Browse files
committed
1) Resolving CR comments
2) Adding cmdlet to fetch storage mappings
1 parent dcf396a commit da84e89

10 files changed

+194
-128
lines changed

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/Commands.SiteRecovery.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
</Reference>
5454
<Reference Include="Microsoft.Azure.Management.SiteRecovery, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
5555
<SpecificVersion>False</SpecificVersion>
56-
<HintPath>..\..\..\packages\Microsoft.Azure.Management.SiteRecovery.1.0.3-preview\lib\net40\Microsoft.Azure.Management.SiteRecovery.dll</HintPath>
56+
<Private>True</Private>
5757
</Reference>
5858
<Reference Include="Microsoft.IdentityModel.Clients.ActiveDirectory, Version=2.18.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
5959
<HintPath>..\..\..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.2.18.206251556\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll</HintPath>
@@ -168,6 +168,7 @@
168168
<Compile Include="Policy\StartAzureSiteRecoveryPolicyDissociationJob.cs" />
169169
<Compile Include="Server\GetAzureSiteRecoveryServer.cs" />
170170
<Compile Include="Storage\Classification\GetAzureSiteRecoveryStorageClassification.cs" />
171+
<Compile Include="Storage\Classification\GetAzureSiteRecoveryStorageClassificationMapping.cs" />
171172
<Compile Include="Storage\Classification\StartAzureSiteRecoveryStorageClassificationMappingJob.cs" />
172173
<Compile Include="Storage\Classification\StartAzureSiteRecoveryStorageClassificationUnmappingJob.cs" />
173174
<Compile Include="Utilities\CertUtils.cs" />

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

Lines changed: 11 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -89,73 +89,42 @@ public Task EnumerateStorageClassificationMappingsAsync(Action<IEnumerable<Stora
8989
/// Starts job for unmapping storage classifications.
9090
/// </summary>
9191
/// <param name="mapping">Classification mapping.</param>
92-
/// <returns>Job object.</returns>
93-
public ASRJob UnmapStorageClassifications(StorageClassificationMapping mapping)
92+
/// <returns>Operation response.</returns>
93+
public LongRunningOperationResponse UnmapStorageClassifications(
94+
StorageClassificationMapping mapping)
9495
{
9596
string[] tokens = mapping.Id.UnFormatArmId(
9697
ARMResourceIdPaths.StorageClassificationMappingResourceIdPath);
97-
LongRunningOperationResponse operationResponse =
98-
this.GetSiteRecoveryClient().StorageClassificationMapping
98+
return this.GetSiteRecoveryClient().StorageClassificationMapping
9999
.BeginUnpairStorageClassification(
100100
tokens[0],
101101
tokens[1],
102102
tokens[2],
103103
this.GetRequestHeaders());
104-
105-
JobResponse jobResponse =
106-
this.GetAzureSiteRecoveryJobDetails(
107-
PSRecoveryServicesClient.GetJobIdFromReponseLocation(operationResponse.Location));
108-
109-
return new ASRJob(jobResponse.Job);
110104
}
111105

112106
/// <summary>
113107
/// Starts job for mapping storage classification.
114108
/// </summary>
115109
/// <param name="primaryClassification">Primary classification.</param>
116-
/// <param name="recoveryClassification">Recovery classification.</param>
110+
/// <param name="input">Mapping input.</param>
117111
/// <param name="armName">Optional. ARM name of the mapping.</param>
118-
/// <returns>Job object.</returns>
119-
public ASRJob MapStorageClassification(
112+
/// <returns>Operation response.</returns>
113+
public LongRunningOperationResponse MapStorageClassification(
120114
ASRStorageClassification primaryClassification,
121-
ASRStorageClassification recoveryClassification,
122-
string armName = null)
115+
StorageClassificationMappingInput input,
116+
string armName)
123117
{
124-
string[] tokens = primaryClassification.StorageClassificationId.UnFormatArmId(
118+
string[] tokens = primaryClassification.Id.UnFormatArmId(
125119
ARMResourceIdPaths.StorageClassificationResourceIdPath);
126120

127-
if (string.IsNullOrEmpty(armName))
128-
{
129-
armName = string.Format(
130-
"StrgMap_{0}_{1}",
131-
primaryClassification.StorageClassificationFriendlyName,
132-
recoveryClassification.StorageClassificationFriendlyName);
133-
}
134-
135-
var props = new StorageClassificationMappingInputProperties()
136-
{
137-
TargetStorageClassificationId = recoveryClassification.StorageClassificationId
138-
};
139-
140-
var input = new StorageClassificationMappingInput()
141-
{
142-
Properties = props
143-
};
144-
145-
LongRunningOperationResponse operationResponse =
146-
this.GetSiteRecoveryClient().StorageClassificationMapping
121+
return this.GetSiteRecoveryClient().StorageClassificationMapping
147122
.BeginPairStorageClassification(
148123
tokens[0],
149124
tokens[1],
150125
armName,
151126
input,
152127
this.GetRequestHeaders());
153-
154-
JobResponse jobResponse =
155-
this.GetAzureSiteRecoveryJobDetails(
156-
PSRecoveryServicesClient.GetJobIdFromReponseLocation(operationResponse.Location));
157-
158-
return new ASRJob(jobResponse.Job);
159128
}
160129
}
161130

@@ -200,43 +169,5 @@ public static string GetFabricId(
200169
ARMResourceIdPaths.FabricResourceIdPath,
201170
tokens[0]);
202171
}
203-
204-
/// <summary>
205-
/// Gets powershell object from Storage classification object.
206-
/// </summary>
207-
/// <param name="classification">Classification to process.</param>
208-
/// <param name="classificationMap">Dictionary of all possible classifications.</param>
209-
/// <param name="fabricMap">Dictionary of list of fabrics.</param>
210-
/// <param name="mappingsDict">Dictionary of mapping objects.</param>
211-
/// <returns>Powershell representation of storage classification.</returns>
212-
public static ASRStorageClassification GetPSObject(
213-
this StorageClassification classification,
214-
Dictionary<string, StorageClassification> classificationMap,
215-
Dictionary<string, Fabric> fabricMap,
216-
Dictionary<string, List<StorageClassificationMapping>> mappingsDict)
217-
{
218-
var fabric = fabricMap[classification.GetFabricId()];
219-
List<StorageClassificationMapping> targetClassifications;
220-
221-
return new ASRStorageClassification()
222-
{
223-
FabricFriendlyName = fabric.Properties.FriendlyName,
224-
FabricId = fabric.Id,
225-
StorageClassificationFriendlyName =
226-
classification.Properties.FriendlyName,
227-
StorageClassificationId = classification.Id,
228-
TargetClassifications =
229-
mappingsDict.TryGetValue(
230-
classification.Id,
231-
out targetClassifications) ?
232-
targetClassifications.ConvertAll(item =>
233-
classificationMap[item.Properties.TargetStorageClassificationId]
234-
.GetPSObject(
235-
classificationMap,
236-
fabricMap,
237-
mappingsDict)) :
238-
new List<ASRStorageClassification>()
239-
};
240-
}
241172
}
242173
}

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

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,29 +1336,50 @@ public ASRProviderError(ProviderError error)
13361336
public class ASRStorageClassification
13371337
{
13381338
/// <summary>
1339-
/// Gets or sets Storage classification ARM name.
1339+
/// Gets or sets Storage classification ARM Id.
13401340
/// </summary>
1341-
public string StorageClassificationId { get; set; }
1341+
public string Id { get; set; }
13421342

13431343
/// <summary>
1344-
/// Gets or sets Storage classification friendly name.
1344+
/// Gets or sets Storage classification ARM name.
13451345
/// </summary>
1346-
public string StorageClassificationFriendlyName { get; set; }
1346+
public string Name { get; set; }
13471347

13481348
/// <summary>
1349-
/// Gets or sets Storage classification fabric ARM name.
1349+
/// Gets or sets Storage classification friendly name.
13501350
/// </summary>
1351-
public string FabricId { get; set; }
1351+
public string FriendlyName { get; set; }
13521352

13531353
/// <summary>
13541354
/// Gets or sets Fabric friendly name.
13551355
/// </summary>
13561356
public string FabricFriendlyName { get; set; }
1357+
}
1358+
1359+
/// <summary>
1360+
/// Represents Azure site recovery storage classification mapping.
1361+
/// </summary>
1362+
public class ASRStorageClassificationMapping
1363+
{
1364+
/// <summary>
1365+
/// Gets or sets Storage classification ARM Id.
1366+
/// </summary>
1367+
public string Id { get; set; }
1368+
1369+
/// <summary>
1370+
/// Gets or sets Storage classification ARM name.
1371+
/// </summary>
1372+
public string Name { get; set; }
1373+
1374+
/// <summary>
1375+
/// Gets or sets primary classification ARM Id.
1376+
/// </summary>
1377+
public string PrimaryClassificationId { get; set; }
13571378

13581379
/// <summary>
1359-
/// Gets or sets Target classifications.
1380+
/// Gets or sets recovery classification ARM Id.
13601381
/// </summary>
1361-
public List<ASRStorageClassification> TargetClassifications { get; set; }
1382+
public string RecoveryClassificationId { get; set; }
13621383
}
13631384

13641385
/// <summary>

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

Lines changed: 1 addition & 1 deletion
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,6 @@ Please provide a storage account with the same location as that of the vault.</v
311311
<value>SiteRecovery vault type will be deprecated soon. Please use RecoveryServices vault type instead.</value>
312312
</data>
313313
<data name="NoClassificationMappingFound" xml:space="preserve">
314-
<value>No storage classification mapping found between {0} and {1}</value>
314+
<value>No storage classification mapping found with Id {0}</value>
315315
</data>
316316
</root>

src/ResourceManager/SiteRecovery/Commands.SiteRecovery/Storage/Classification/GetAzureSiteRecoveryStorageClassification.cs

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,29 @@ namespace Microsoft.Azure.Commands.SiteRecovery
2929
[OutputType(typeof(IEnumerable<ASRStorageClassification>))]
3030
public class GetAzureSiteRecoveryStorageClassification : SiteRecoveryCmdletBase
3131
{
32+
#region Parameters
33+
/// <summary>
34+
/// Gets or sets name of classification.
35+
/// </summary>
36+
[Parameter(ParameterSetName = ASRParameterSets.ByName, Mandatory = true, ValueFromPipeline = true)]
37+
[ValidateNotNullOrEmpty]
38+
public string Name { get; set; }
39+
40+
/// <summary>
41+
/// Gets or sets friendly name of classification.
42+
/// </summary>
43+
[Parameter(ParameterSetName = ASRParameterSets.ByFriendlyName, Mandatory = true, ValueFromPipeline = true)]
44+
[ValidateNotNullOrEmpty]
45+
public string FriendlyName { get; set; }
46+
#endregion
47+
3248
/// <summary>
3349
/// ProcessRecord of the command.
3450
/// </summary>
3551
public override void ExecuteCmdlet()
3652
{
3753
List<Fabric> fabrics = new List<Fabric>();
3854
List<StorageClassification> storageClassifications = new List<StorageClassification>();
39-
List<StorageClassificationMapping> storageClassificationMappings
40-
= new List<StorageClassificationMapping>();
4155

4256
Task fabricTask = RecoveryServicesClient.EnumerateFabricsAsync((entities) =>
4357
{
@@ -50,28 +64,42 @@ List<StorageClassificationMapping> storageClassificationMappings
5064
storageClassifications.AddRange(entities);
5165
});
5266

53-
Task mappingsTask =
54-
RecoveryServicesClient.EnumerateStorageClassificationMappingsAsync((entities) =>
55-
{
56-
storageClassificationMappings.AddRange(entities);
57-
});
58-
59-
Task.WaitAll(fabricTask, storageClassificationTask, mappingsTask);
67+
Task.WaitAll(fabricTask, storageClassificationTask);
6068

6169
var fabricMap = fabrics.ToDictionary(item => item.Id, item => item);
62-
var classificationMap = storageClassifications
63-
.ToDictionary(item => item.Id, item => item);
64-
var mappingsDict = storageClassificationMappings
65-
.GroupBy(item => item.GetPrimaryStorageClassificationId())
66-
.ToDictionary(item => item.Key, item => item.ToList());
6770

68-
List<ASRStorageClassification> psStorageClassifications
69-
= new List<ASRStorageClassification>();
71+
switch (this.ParameterSetName)
72+
{
73+
case ASRParameterSets.ByFriendlyName:
74+
storageClassifications = storageClassifications.Where(item =>
75+
item.Properties.FriendlyName.Equals(
76+
this.FriendlyName,
77+
StringComparison.InvariantCultureIgnoreCase))
78+
.ToList();
79+
break;
80+
case ASRParameterSets.ByName:
81+
storageClassifications = storageClassifications.Where(item =>
82+
item.Name.Equals(
83+
this.Name,
84+
StringComparison.InvariantCultureIgnoreCase))
85+
.ToList();
86+
break;
87+
}
7088

71-
var psObject = storageClassifications.ConvertAll(item =>
72-
item.GetPSObject(classificationMap, fabricMap, mappingsDict));
89+
var psObject = storageClassifications.ConvertAll(item =>
90+
{
91+
var fabric = fabricMap[item.GetFabricId()];
92+
93+
return new ASRStorageClassification()
94+
{
95+
FabricFriendlyName = fabric.Properties.FriendlyName,
96+
FriendlyName = item.Properties.FriendlyName,
97+
Id = item.Id,
98+
Name = item.Name
99+
};
100+
});
73101

74-
base.WriteObject(psObject);
102+
this.WriteObject(psObject, true);
75103
}
76104
}
77105
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Management.Automation;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using Microsoft.Azure.Management.SiteRecovery.Models;
8+
9+
namespace Microsoft.Azure.Commands.SiteRecovery
10+
{
11+
/// <summary>
12+
/// Retrieves Azure Site Recovery storage classification.
13+
/// </summary>
14+
[Cmdlet(VerbsCommon.Get, "AzureRmSiteRecoveryStorageClassificationMapping", DefaultParameterSetName = ASRParameterSets.Default)]
15+
[OutputType(typeof(IEnumerable<ASRStorageClassification>))]
16+
public class GetAzureSiteRecoveryStorageClassificationMapping : SiteRecoveryCmdletBase
17+
{
18+
#region Parameters
19+
/// <summary>
20+
/// Gets or sets name of classification.
21+
/// </summary>
22+
[Parameter(ParameterSetName = ASRParameterSets.ByName, Mandatory = true, ValueFromPipeline = true)]
23+
[ValidateNotNullOrEmpty]
24+
public string Name { get; set; }
25+
#endregion
26+
27+
/// <summary>
28+
/// ProcessRecord of the command.
29+
/// </summary>
30+
public override void ExecuteCmdlet()
31+
{
32+
List<StorageClassificationMapping> mappings = new List<StorageClassificationMapping>();
33+
Task mappingTask =
34+
RecoveryServicesClient.EnumerateStorageClassificationMappingsAsync((entities) =>
35+
{
36+
mappings.AddRange(entities);
37+
});
38+
39+
Task.WaitAll(mappingTask);
40+
41+
switch (this.ParameterSetName)
42+
{
43+
case ASRParameterSets.ByName:
44+
mappings = mappings.Where(item =>
45+
item.Name.Equals(
46+
this.Name,
47+
StringComparison.InvariantCultureIgnoreCase))
48+
.ToList();
49+
break;
50+
}
51+
52+
var psObject = mappings.ConvertAll(item =>
53+
{
54+
return new ASRStorageClassificationMapping()
55+
{
56+
Id = item.Id,
57+
Name = item.Name,
58+
PrimaryClassificationId = item.GetPrimaryStorageClassificationId(),
59+
RecoveryClassificationId = item.Properties.TargetStorageClassificationId
60+
};
61+
});
62+
63+
base.WriteObject(psObject);
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)