Skip to content

Commit 271e5a7

Browse files
author
dragonfly91
committed
Fix for Bug 4308340:[SDKBash2][Powershell] Add tags in Vault object
1 parent bd4939e commit 271e5a7

File tree

5 files changed

+96
-10
lines changed

5 files changed

+96
-10
lines changed

src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/VaultAdapter.cs

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

15+
using Microsoft.Azure.Commands.AzureBackup.Helpers;
1516
using Microsoft.Azure.Management.BackupServices.Models;
1617
using System;
18+
using System.Collections;
1719
using System.Collections.Generic;
20+
using System.Linq;
1821

1922
namespace Microsoft.Azure.Commands.AzureBackup.ClientAdapter
2023
{
@@ -29,7 +32,7 @@ public partial class AzureBackupClientAdapter
2932
/// <param name="location"></param>
3033
/// <param name="skuParam"></param>
3134
/// <returns></returns>
32-
public AzureBackupVault CreateOrUpdateAzureBackupVault(string resourceGroupName, string vaultName, string location)
35+
public AzureBackupVault CreateOrUpdateAzureBackupVault(string resourceGroupName, string vaultName, string location, Hashtable[] Tag)
3336
{
3437
var createResourceParameters = new AzureBackupVaultCreateOrUpdateParameters()
3538
{
@@ -41,6 +44,7 @@ public AzureBackupVault CreateOrUpdateAzureBackupVault(string resourceGroupName,
4144
Name = defaultSKU,
4245
},
4346
},
47+
Tags = Tag.ConvertToDictionary(),
4448
};
4549

4650
var response = AzureBackupVaultClient.Vault.CreateOrUpdateAsync(resourceGroupName, vaultName, createResourceParameters, GetCustomRequestHeaders(), CmdletCancellationToken).Result;

src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Vault/NewAzureRMBackupVault.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Microsoft.Azure.Commands.AzureBackup.Models;
1717
using Microsoft.Azure.Commands.AzureBackup.Properties;
1818
using System;
19+
using System.Collections;
1920
using System.Management.Automation;
2021

2122
namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets
@@ -41,10 +42,9 @@ public class NewAzureRMBackupVault : AzureBackupCmdletBase
4142
[Parameter(Position = 3, Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.StorageType)]
4243
public AzureBackupVaultStorageType Storage { get; set; }
4344

44-
// TODO: Add support for tags
45-
//[Alias("Tags")]
46-
//[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ResourceTags)]
47-
//public Hashtable[] Tag { get; set; }
45+
[Alias("Tags")]
46+
[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ResourceTags)]
47+
public Hashtable[] Tag { get; set; }
4848

4949
public override void ExecuteCmdlet()
5050
{
@@ -55,7 +55,7 @@ public override void ExecuteCmdlet()
5555

5656
WriteDebug(String.Format(Resources.CreatingBackupVault, ResourceGroupName, Name));
5757

58-
var createdVault = AzureBackupClient.CreateOrUpdateAzureBackupVault(ResourceGroupName, Name, Region);
58+
var createdVault = AzureBackupClient.CreateOrUpdateAzureBackupVault(ResourceGroupName, Name, Region, Tag);
5959

6060
if (Storage != 0)
6161
{

src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Vault/SetAzureRMBackupVault.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Microsoft.Azure.Commands.AzureBackup.Models;
1717
using Microsoft.Azure.Commands.AzureBackup.Properties;
1818
using System;
19+
using System.Collections;
1920
using System.Management.Automation;
2021
using CmdletModel = Microsoft.Azure.Commands.AzureBackup.Models;
2122

@@ -31,9 +32,9 @@ public class SetAzureRMBackupVault : AzureBackupVaultCmdletBase
3132
public AzureBackupVaultStorageType Storage { get; set; }
3233

3334
// TODO: Add support for tags
34-
//[Alias("Tags")]
35-
//[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ResourceTags)]
36-
//public Hashtable[] Tag { get; set; }
35+
[Alias("Tags")]
36+
[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ResourceTags)]
37+
public Hashtable[] Tag { get; set; }
3738

3839
public override void ExecuteCmdlet()
3940
{
@@ -48,6 +49,11 @@ public override void ExecuteCmdlet()
4849
AzureBackupClient.UpdateStorageType(Vault.ResourceGroupName, Vault.Name, Storage.ToString());
4950
}
5051

52+
if (Tag != null)
53+
{
54+
AzureBackupClient.CreateOrUpdateAzureBackupVault(Vault.ResourceGroupName, Vault.Name, Vault.Region, Tag);
55+
}
56+
5157
var backupVault = AzureBackupClient.GetVault(Vault.ResourceGroupName, Vault.Name);
5258
WriteObject(VaultHelpers.GetCmdletVault(backupVault, AzureBackupClient.GetStorageTypeDetails(Vault.ResourceGroupName, Vault.Name)));
5359
});

src/ResourceManager/AzureBackup/Commands.AzureBackup/Helpers/VaultHelpers.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
// ----------------------------------------------------------------------------------
1414

1515
using System;
16+
using System.Collections;
17+
using System.Collections.Generic;
18+
using System.Linq;
1619
using ClientModel = Microsoft.Azure.Management.BackupServices.Models;
1720
using CmdletModel = Microsoft.Azure.Commands.AzureBackup.Models;
1821

@@ -35,6 +38,7 @@ public static CmdletModel.AzureRMBackupVault GetCmdletVault(ClientModel.AzureBac
3538
Region = vault.Location,
3639
ResourceGroupName = GetResourceGroup(vault.Id),
3740
Storage = storageType,
41+
Tags = vault.Tags.GetTagsHashtables(),
3842
};
3943

4044
return response;
@@ -50,5 +54,76 @@ public static string GetResourceGroup(string vaultId)
5054
string[] tokens = vaultId.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
5155
return tokens[3];
5256
}
57+
58+
/// <summary>
59+
/// Extension to convert enumerable Hashtable into a dictionary
60+
/// </summary>
61+
/// <param name="tags"></param>
62+
/// <returns></returns>
63+
public static Dictionary<string, string> ConvertToDictionary(this Hashtable[] tags)
64+
{
65+
return tags == null
66+
? null
67+
: tags
68+
.CoalesceEnumerable()
69+
.Select(hashTable => hashTable.OfType<DictionaryEntry>()
70+
.ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value))
71+
.Where(tagDictionary => tagDictionary.ContainsKey("Name"))
72+
.Select(tagDictionary => Tuple
73+
.Create(
74+
tagDictionary["Name"].ToString(),
75+
tagDictionary.ContainsKey("Value") ? tagDictionary["Value"].ToString() : string.Empty))
76+
.Distinct(kvp => kvp.Item1)
77+
.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
78+
}
79+
80+
/// <summary>
81+
/// Extension to coalesce enumerable
82+
/// </summary>
83+
/// <typeparam name="TSource">Enumerable type</typeparam>
84+
/// <param name="source">Enumerable</param>
85+
/// <returns></returns>
86+
public static IEnumerable<TSource> CoalesceEnumerable<TSource>(this IEnumerable<TSource> source)
87+
{
88+
return source ?? Enumerable.Empty<TSource>();
89+
}
90+
91+
/// <summary>
92+
/// Extension to remove duplicates from enumerable based on a provided key selector
93+
/// </summary>
94+
/// <typeparam name="TSource">Enumerable type</typeparam>
95+
/// <typeparam name="TKeyType">Type of key</typeparam>
96+
/// <param name="source">Input enumerable to remove duplicates from</param>
97+
/// <param name="keySelector">Lambda to select key</param>
98+
/// <returns></returns>
99+
public static IEnumerable<TSource> Distinct<TSource, TKeyType>(this IEnumerable<TSource> source, Func<TSource, TKeyType> keySelector)
100+
{
101+
var set = new Dictionary<TKeyType, TSource>(EqualityComparer<TKeyType>.Default);
102+
foreach (TSource element in source)
103+
{
104+
TSource value;
105+
var key = keySelector(element);
106+
if (!set.TryGetValue(key, out value))
107+
{
108+
yield return element;
109+
}
110+
else
111+
{
112+
set[key] = value;
113+
}
114+
}
115+
}
116+
117+
/// <summary>
118+
/// Extension to convert dictionary to hashtable enumerable
119+
/// </summary>
120+
/// <param name="tags"></param>
121+
/// <returns></returns>
122+
public static Hashtable[] GetTagsHashtables(this IDictionary<string, string> tags)
123+
{
124+
return tags == null
125+
? null
126+
: tags.Select(kvp => new Hashtable { { "Name", kvp.Key }, { "Value", kvp.Value } }).ToArray();
127+
}
53128
}
54129
}

src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzurePSBackupVault.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
using Microsoft.Azure.Commands.AzureBackup.Properties;
1616
using System;
17+
using System.Collections;
1718

1819
namespace Microsoft.Azure.Commands.AzureBackup.Models
1920
{
@@ -30,7 +31,7 @@ public class AzureRMBackupVault
3031

3132
public string Region { get; set; }
3233

33-
// public Hashtable[] Tags { get; protected set; }
34+
public Hashtable[] Tags { get; set; }
3435

3536
public string Storage { get; set; }
3637

0 commit comments

Comments
 (0)