Skip to content

Commit bb875d9

Browse files
committed
Update with UMI scenarios
1 parent f2d5118 commit bb875d9

9 files changed

+159
-70
lines changed

src/Sql/Sql/Auditing/Services/AuditingEndpointsCommunicator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public DiagnosticSettingsResource UpdateDiagnosticSettings(DiagnosticSettingsRes
226226
if (server.Identity == null ||
227227
server.Identity.Type != ResourceIdentityType.SystemAssigned.ToString())
228228
{
229-
server.Identity = ResourceIdentityHelper.GetIdentityObjectFromType(true, false, null);
229+
server.Identity = ResourceIdentityHelper.GetIdentityObjectFromType(true, "SystemAssigned", null, null);
230230
server = GetCurrentSqlClient().Servers.CreateOrUpdate(resourceGroupName, serverName, server);
231231
}
232232

src/Sql/Sql/Common/ResourceIdentityHelper.cs

Lines changed: 83 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,60 @@
1515
using Microsoft.Azure.Management.Sql.Models;
1616
using System.Collections.Generic;
1717
using System.Linq;
18+
using System.Management.Automation;
1819
using System.Runtime.CompilerServices;
1920

2021
namespace Microsoft.Azure.Commands.Sql.Common
2122
{
2223
public enum ResourceIdentityType
2324
{
2425
SystemAssigned,
26+
SystemAssignedUserAssigned,
2527
UserAssigned,
2628
None
2729
}
2830

2931
public class ResourceIdentityHelper
3032
{
31-
public static Management.Sql.Models.ResourceIdentity GetIdentityObjectFromType(bool assignIdentityIsPresent, bool userAssignedIdentityIsPresent, List<string> userAssignedIdentities)
33+
public static Management.Sql.Models.ResourceIdentity GetIdentityObjectFromType(bool assignIdentityIsPresent, string resourceIdentityType, List<string> userAssignedIdentities, Management.Sql.Models.ResourceIdentity existingResourceIdentity)
3234
{
3335
Management.Sql.Models.ResourceIdentity identityResult = null;
3436

35-
if (assignIdentityIsPresent && userAssignedIdentityIsPresent)
37+
// If the user passes in IdentityType as None, then irrespective of previous config, we set the IdentityType to be None.
38+
//
39+
if (resourceIdentityType != null && resourceIdentityType.Equals(ResourceIdentityType.None.ToString()))
40+
{
41+
identityResult = new Management.Sql.Models.ResourceIdentity()
42+
{
43+
Type = ResourceIdentityType.None.ToString()
44+
};
45+
46+
return identityResult;
47+
}
48+
49+
if (resourceIdentityType != null && assignIdentityIsPresent && resourceIdentityType.Equals(ResourceIdentityType.SystemAssignedUserAssigned.ToString()))
3650
{
3751
Dictionary<string, UserIdentity> umiDict = new Dictionary<string, UserIdentity>();
3852

39-
if (userAssignedIdentities != null && userAssignedIdentities.Any())
53+
if (userAssignedIdentities == null)
54+
{
55+
throw new PSArgumentNullException("The list of user assigned identity ids needs to be passed if the IdentityType is UserAssigned or SystemAssignedUserAssigned");
56+
}
57+
58+
if (existingResourceIdentity != null && userAssignedIdentities.Any()
59+
&& existingResourceIdentity.UserAssignedIdentities != null)
60+
{
61+
foreach (string identity in userAssignedIdentities)
62+
{
63+
existingResourceIdentity.UserAssignedIdentities.Add(identity, new UserIdentity());
64+
}
65+
66+
identityResult = new Management.Sql.Models.ResourceIdentity()
67+
{
68+
Type = ResourceIdentityType.SystemAssignedUserAssigned.ToString()
69+
};
70+
}
71+
else if (userAssignedIdentities.Any())
4072
{
4173
foreach (string identity in userAssignedIdentities)
4274
{
@@ -45,34 +77,70 @@ public static Management.Sql.Models.ResourceIdentity GetIdentityObjectFromType(b
4577

4678
identityResult = new Management.Sql.Models.ResourceIdentity()
4779
{
48-
Type = ResourceIdentityType.UserAssigned.ToString(),
80+
Type = ResourceIdentityType.SystemAssignedUserAssigned.ToString(),
4981
UserAssignedIdentities = umiDict
5082
};
5183
}
52-
else
84+
}
85+
else if (resourceIdentityType != null && assignIdentityIsPresent && resourceIdentityType.Equals(ResourceIdentityType.UserAssigned.ToString()))
86+
{
87+
Dictionary<string, UserIdentity> umiDict = new Dictionary<string, UserIdentity>();
88+
89+
if (userAssignedIdentities == null)
5390
{
91+
throw new PSArgumentNullException("The list of user assigned identity ids needs to be passed if the IdentityType is UserAssigned or SystemAssignedUserAssigned");
92+
}
93+
94+
if (existingResourceIdentity != null && userAssignedIdentities.Any()
95+
&& existingResourceIdentity.UserAssignedIdentities != null)
96+
{
97+
foreach (string identity in userAssignedIdentities)
98+
{
99+
existingResourceIdentity.UserAssignedIdentities.Add(identity, new UserIdentity());
100+
}
101+
54102
identityResult = new Management.Sql.Models.ResourceIdentity()
55103
{
56-
Type = ResourceIdentityType.SystemAssigned.ToString()
104+
Type = ResourceIdentityType.UserAssigned.ToString()
105+
};
106+
}
107+
else if (userAssignedIdentities.Any())
108+
{
109+
foreach (string identity in userAssignedIdentities)
110+
{
111+
umiDict.Add(identity, new UserIdentity());
112+
}
113+
114+
identityResult = new Management.Sql.Models.ResourceIdentity()
115+
{
116+
Type = ResourceIdentityType.UserAssigned.ToString(),
117+
UserAssignedIdentities = umiDict
57118
};
58-
}
119+
}
59120
}
60121
else if (assignIdentityIsPresent)
61122
{
62-
identityResult = new Management.Sql.Models.ResourceIdentity()
123+
if (existingResourceIdentity != null)
63124
{
64-
Type = ResourceIdentityType.SystemAssigned.ToString()
65-
};
125+
identityResult = existingResourceIdentity;
126+
identityResult.Type = ResourceIdentityType.SystemAssigned.ToString();
127+
}
128+
else
129+
{
130+
identityResult = new Management.Sql.Models.ResourceIdentity()
131+
{
132+
Type = ResourceIdentityType.SystemAssigned.ToString()
133+
};
134+
}
66135
}
67-
else if (!assignIdentityIsPresent && !userAssignedIdentityIsPresent)
136+
137+
if (!assignIdentityIsPresent && existingResourceIdentity != null && existingResourceIdentity.PrincipalId != null)
68138
{
69-
identityResult = new Management.Sql.Models.ResourceIdentity()
70-
{
71-
Type = ResourceIdentityType.None.ToString()
72-
};
139+
identityResult = existingResourceIdentity;
73140
}
74141

75142
return identityResult;
143+
76144
}
77145
}
78146
}

src/Sql/Sql/ManagedInstance/Cmdlet/NewAzureSqlManagedInstance.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,11 +342,15 @@ public class NewAzureSqlManagedInstance : ManagedInstanceCmdletBase
342342
/// </summary>
343343
[Parameter(Mandatory = false,
344344
HelpMessage = "List of user assigned identities")]
345-
public List<string> UserAssignedIdentity { get; set; }
345+
public List<string> UserAssignedIdentityId { get; set; }
346346

347+
// <summary>
348+
/// Type of identity to be assigned to the server..
349+
/// </summary>
347350
[Parameter(Mandatory = false,
348-
HelpMessage = "Generate and assign an Azure Active Directory User Assigned Identity for this server for use with key management services like Azure KeyVault.")]
349-
public SwitchParameter AssignUserAssignIdentity { get; set; }
351+
HelpMessage = "Type of Identity to be used. Possible values are SystemAsssigned, UserAssigned, SystemAssignedUserAssigned and None.")]
352+
[PSArgumentCompleter("SystemAssigned", "UserAssigned", "SystemAssignedUserAssigned", "None")]
353+
public string IdentityType { get; set; }
350354

351355
/// <summary>
352356
/// Gets or sets whether or not to run this cmdlet in the background as a job
@@ -521,7 +525,7 @@ public override void ExecuteCmdlet()
521525
AdministratorPassword = (this.AdministratorCredential != null) ? this.AdministratorCredential.Password : null,
522526
AdministratorLogin = (this.AdministratorCredential != null) ? this.AdministratorCredential.UserName : null,
523527
Tags = TagsConversionHelper.CreateTagDictionary(Tag, validate: true),
524-
Identity = ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity, this.AssignUserAssignIdentity, UserAssignedIdentity),
528+
Identity = ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity.IsPresent, this.IdentityType ?? null, UserAssignedIdentityId, null),
525529
LicenseType = this.LicenseType,
526530
// `-StorageSizeInGB 0` as a parameter to this cmdlet means "use default".
527531
// For non-MI database, we can just pass in 0 and the server will treat 0 as default.

src/Sql/Sql/ManagedInstance/Cmdlet/SetAzureSqlManagedInstance.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,15 @@ public class SetAzureSqlManagedInstance : ManagedInstanceCmdletBase
223223
/// </summary>
224224
[Parameter(Mandatory = false,
225225
HelpMessage = "List of user assigned identities")]
226-
public List<string> UserAssignedIdentity { get; set; }
226+
public List<string> UserAssignedIdentityId { get; set; }
227227

228+
// <summary>
229+
/// List of user assigned identities.
230+
/// </summary>
228231
[Parameter(Mandatory = false,
229-
HelpMessage = "Generate and assign an Azure Active Directory User Assigned Identity for this server for use with key management services like Azure KeyVault.")]
230-
public SwitchParameter AssignUserAssignIdentity { get; set; }
232+
HelpMessage = "Type of Identity to be used. Possible values are SystemAsssigned, UserAssigned, SystemAssignedUserAssigned and None.")]
233+
[PSArgumentCompleter("SystemAssigned", "UserAssigned", "SystemAssignedUserAssigned", "None")]
234+
public string IdentityType { get; set; }
231235

232236
/// <summary>
233237
/// Gets or sets whether or not to run this cmdlet in the background as a job
@@ -312,12 +316,12 @@ protected override IEnumerable<AzureSqlManagedInstanceModel> ApplyUserInputToMod
312316
PublicDataEndpointEnabled = this.PublicDataEndpointEnabled,
313317
ProxyOverride = this.ProxyOverride,
314318
Tags = TagsConversionHelper.CreateTagDictionary(Tag, validate: true),
315-
Identity = model.FirstOrDefault().Identity ?? ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity, this.AssignUserAssignIdentity, UserAssignedIdentity),
319+
Identity = ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity.IsPresent, this.IdentityType ?? null, UserAssignedIdentityId, GetEntity().FirstOrDefault().Identity),
316320
InstancePoolName = this.InstancePoolName,
317321
MinimalTlsVersion = this.MinimalTlsVersion,
318322
MaintenanceConfigurationId = this.MaintenanceConfigurationId,
319323
AdministratorLogin = model.FirstOrDefault().AdministratorLogin,
320-
PrimaryUserAssignedIdentityId = this.PrimaryUserAssignedIdentityId,
324+
PrimaryUserAssignedIdentityId = model.FirstOrDefault().PrimaryUserAssignedIdentityId ?? this.PrimaryUserAssignedIdentityId,
321325
KeyId = this.KeyId
322326
});
323327
return updateData;

src/Sql/Sql/Server/Cmdlet/NewAzureSqlServer.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,15 @@ public class NewAzureSqlServer : AzureSqlServerCmdletBase
108108
/// </summary>
109109
[Parameter(Mandatory = false,
110110
HelpMessage = "List of user assigned identities")]
111-
public List<string> UserAssignedIdentity { get; set; }
111+
public List<string> UserAssignedIdentityId { get; set; }
112112

113+
// <summary>
114+
/// Type of identity to be assigned to the server..
115+
/// </summary>
113116
[Parameter(Mandatory = false,
114-
HelpMessage = "Generate and assign an Azure Active Directory User Assigned Identity for this server for use with key management services like Azure KeyVault.")]
115-
public SwitchParameter AssignUserAssignIdentity { get; set; }
117+
HelpMessage = "Type of Identity to be used. Possible values are SystemAsssigned, UserAssigned, SystemAssignedUserAssigned and None.")]
118+
[PSArgumentCompleter("SystemAssigned", "UserAssigned", "SystemAssignedUserAssigned", "None")]
119+
public string IdentityType { get; set; }
116120

117121
/// <summary>
118122
/// Gets or sets whether or not to run this cmdlet in the background as a job
@@ -209,7 +213,7 @@ public override void ExecuteCmdlet()
209213
SqlAdministratorPassword = (this.SqlAdministratorCredentials != null) ? this.SqlAdministratorCredentials.Password : null,
210214
SqlAdministratorLogin = (this.SqlAdministratorCredentials != null) ? this.SqlAdministratorCredentials.UserName : null,
211215
Tags = TagsConversionHelper.CreateTagDictionary(Tags, validate: true),
212-
Identity = ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity, this.AssignUserAssignIdentity, UserAssignedIdentity),
216+
Identity = ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity.IsPresent, this.IdentityType ?? null, UserAssignedIdentityId, null),
213217
MinimalTlsVersion = this.MinimalTlsVersion,
214218
PublicNetworkAccess = this.PublicNetworkAccess,
215219
PrimaryUserAssignedIdentityId = this.PrimaryUserAssignedIdentityId,

src/Sql/Sql/Server/Cmdlet/SetAzureSqlServer.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,15 @@ public class SetAzureSqlServer : AzureSqlServerCmdletBase
102102
/// </summary>
103103
[Parameter(Mandatory = false,
104104
HelpMessage = "List of user assigned identities")]
105-
public List<string> UserAssignedIdentity { get; set; }
105+
public List<string> UserAssignedIdentityId { get; set; }
106106

107+
// <summary>
108+
/// Type of identity to be assigned to the server..
109+
/// </summary>
107110
[Parameter(Mandatory = false,
108-
HelpMessage = "Generate and assign an Azure Active Directory User Assigned Identity for this server for use with key management services like Azure KeyVault.")]
109-
public SwitchParameter AssignUserAssignIdentity { get; set; }
111+
HelpMessage = "Type of Identity to be used. Possible values are SystemAsssigned, UserAssigned, SystemAssignedUserAssigned and None.")]
112+
[PSArgumentCompleter("SystemAssigned", "UserAssigned", "SystemAssignedUserAssigned", "None")]
113+
public string IdentityType { get; set; }
110114

111115
/// <summary>
112116
/// Defines whether it is ok to skip the requesting of rule removal confirmation
@@ -145,11 +149,11 @@ public class SetAzureSqlServer : AzureSqlServerCmdletBase
145149
Tags = TagsConversionHelper.ReadOrFetchTags(this, model.FirstOrDefault().Tags),
146150
ServerVersion = this.ServerVersion,
147151
Location = model.FirstOrDefault().Location,
148-
Identity = model.FirstOrDefault().Identity ?? ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity, this.AssignUserAssignIdentity, UserAssignedIdentity),
152+
Identity = ResourceIdentityHelper.GetIdentityObjectFromType(this.AssignIdentity.IsPresent, this.IdentityType ?? null, UserAssignedIdentityId, GetEntity().FirstOrDefault().Identity),
149153
PublicNetworkAccess = this.PublicNetworkAccess,
150154
MinimalTlsVersion = this.MinimalTlsVersion,
151155
SqlAdministratorLogin = model.FirstOrDefault().SqlAdministratorLogin,
152-
PrimaryUserAssignedIdentityId = this.PrimaryUserAssignedIdentityId,
156+
PrimaryUserAssignedIdentityId = model.FirstOrDefault().PrimaryUserAssignedIdentityId ?? this.PrimaryUserAssignedIdentityId,
153157
KeyId = this.KeyId
154158
});
155159
return updateData;

src/Sql/Sql/TransparentDataEncryption/Cmdlet/SetAzureSqlServerTransparentDataEncryptionProtector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public class SetAzureSqlServerTransparentDataEncryptionProtector : AzureSqlServe
5555
ValueFromPipelineByPropertyName = true,
5656
HelpMessage = "The Key Auto Rotation status")]
5757
[ValidateNotNullOrEmpty]
58-
public SwitchParameter AutoRotationEnabled { get; set; }
58+
public bool? AutoRotationEnabled { get; set; }
5959

6060
/// <summary>
6161
/// Defines whether it is ok to skip the requesting of setting Transparent Data Encryption protector confirmation

0 commit comments

Comments
 (0)