-
Notifications
You must be signed in to change notification settings - Fork 4.1k
[Az.ServiceFabric] Update New and Set commands for Managed Clusters with new parameters #29263
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -14,13 +14,15 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using System; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using System.Collections; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using System.Collections.Generic; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using System.Linq; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using System.Management.Automation; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using Microsoft.Azure.Commands.ServiceFabric.Common; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using Microsoft.Azure.Commands.ServiceFabric.Models; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using Microsoft.Azure.Management.ServiceFabricManagedClusters; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using Microsoft.Azure.Management.ServiceFabricManagedClusters.Models; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using Microsoft.WindowsAzure.Commands.Utilities.Common; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| namespace Microsoft.Azure.Commands.ServiceFabric.Commands | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -87,6 +89,30 @@ public class NewAzServiceFabricManagedClusterApplication : ManagedApplicationCmd | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ValueFromPipeline = true, ParameterSetName = CreateAppTypeVersion, HelpMessage = "Specify the tags as key/value pairs.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public Hashtable Tag { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #region Identity params | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = SkipAppTypeVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = CreateAppTypeVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public ManagedIdentityType IdentityType { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+94
to
+98
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = SkipAppTypeVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the list of user assigned identity ARM resource IDs for the application.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = CreateAppTypeVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the list of user assigned identity ARM resource IDs for the application.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [ValidateNotNullOrEmpty] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public string[] UserAssignedIdentityId { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = SkipAppTypeVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the application managed identities as key/value pairs. The key is the friendly identity name, and the value is the principal id.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = CreateAppTypeVersion, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the application managed identities as key/value pairs. The key is the friendly identity name, and the value is the principal id.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [ValidateNotNullOrEmpty] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public Hashtable ApplicationManagedIdentity { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+94
to
+112
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #endregion | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, HelpMessage = "Continue without prompts")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public SwitchParameter Force { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -168,9 +194,43 @@ private ApplicationResource GetNewAppParameters(string location) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| version: this.GetAppTypeArmResourceId(this.DefaultContext.Subscription.Id, this.ResourceGroupName, this.ClusterName, this.ApplicationTypeName, this.ApplicationTypeVersion), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| parameters: this.ApplicationParameter?.Cast<DictionaryEntry>().ToDictionary(d => d.Key as string, d => d.Value as string), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| location: location, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| identity: this.GetManagedIdentity(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| managedIdentities: this.GetApplicationManagedIdentities(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| tags: this.Tag?.Cast<DictionaryEntry>().ToDictionary(d => d.Key as string, d => d.Value as string)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private ManagedIdentity GetManagedIdentity() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (!this.IsParameterBound(c => c.IdentityType)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var identity = new ManagedIdentity(type: this.IdentityType); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+204
to
+210
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (!this.IsParameterBound(c => c.IdentityType)) | |
| { | |
| return null; | |
| } | |
| var identity = new ManagedIdentity(type: this.IdentityType); | |
| // If neither an identity type nor any user-assigned identities are provided, | |
| // there is no managed identity configuration to apply. | |
| if (!this.IsParameterBound(c => c.IdentityType) && | |
| (this.UserAssignedIdentityId == null || this.UserAssignedIdentityId.Length == 0)) | |
| { | |
| return null; | |
| } | |
| // Start from the provided identity type (if any). | |
| var identityType = this.IdentityType; | |
| // If user-assigned identities are specified but IdentityType is not explicitly bound, | |
| // infer an appropriate type so that the parameter behaves as expected. | |
| if (!this.IsParameterBound(c => c.IdentityType) && | |
| this.UserAssignedIdentityId != null && | |
| this.UserAssignedIdentityId.Length > 0) | |
| { | |
| identityType = "UserAssigned"; | |
| } | |
| else if (this.IsParameterBound(c => c.IdentityType) && | |
| this.UserAssignedIdentityId != null && | |
| this.UserAssignedIdentityId.Length > 0) | |
| { | |
| // Validate that the explicitly provided IdentityType is compatible with | |
| // the presence of user-assigned identities. | |
| var identityTypeString = identityType != null ? identityType.ToString() : string.Empty; | |
| if (identityTypeString.IndexOf("UserAssigned", StringComparison.OrdinalIgnoreCase) < 0) | |
| { | |
| throw new PSArgumentException("UserAssignedIdentityId is specified, but IdentityType does not include 'UserAssigned'."); | |
| } | |
| } | |
| var identity = new ManagedIdentity(type: identityType); |
Copilot
AI
Mar 28, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UserAssignedIdentityId can be specified without IdentityType, but GetManagedIdentity() returns null unless IdentityType is bound, so user-assigned identities are silently ignored. Consider either making -IdentityType mandatory when -UserAssignedIdentityId is provided, or inferring/setting IdentityType to UserAssigned (or SystemAssignedUserAssigned) when user-assigned IDs are supplied.
Copilot
AI
Mar 28, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ApplicationManagedIdentity entries are cast with entry.Key as string / entry.Value as string. Non-string keys/values will become null and will trigger ApplicationUserAssignedIdentity.Validate() failures (Name/PrincipalId cannot be null). Add validation/conversion to ensure all hashtable keys/values are non-empty strings before constructing ApplicationUserAssignedIdentity objects.
| return this.ApplicationManagedIdentity.Cast<DictionaryEntry>() | |
| .Select(entry => new ApplicationUserAssignedIdentity( | |
| name: entry.Key as string, | |
| principalId: entry.Value as string)) | |
| .ToList(); | |
| var identities = new List<ApplicationUserAssignedIdentity>(); | |
| foreach (DictionaryEntry entry in this.ApplicationManagedIdentity) | |
| { | |
| var name = entry.Key?.ToString(); | |
| var principalId = entry.Value?.ToString(); | |
| if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(principalId)) | |
| { | |
| throw new PSArgumentException("ApplicationManagedIdentity must be a hashtable with non-empty string keys (identity names) and non-empty string values (principal identifiers)."); | |
| } | |
| identities.Add(new ApplicationUserAssignedIdentity( | |
| name: name, | |
| principalId: principalId)); | |
| } | |
| return identities; |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -54,7 +54,7 @@ public class SetAzServiceFabricManagedClusterApplication : ManagedApplicationCmd | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = true, Position = 1, ParameterSetName = ByResourceGroup, ValueFromPipelineByPropertyName = true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the name of the cluster.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [ResourceNameCompleter("Microsoft.ServiceFabric/clusters", nameof(ResourceGroupName))] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [ResourceNameCompleter(Constants.ManagedClustersFullType, nameof(ResourceGroupName))] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [ValidateNotNullOrEmpty] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public override string ClusterName { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -244,6 +244,36 @@ public class SetAzServiceFabricManagedClusterApplication : ManagedApplicationCmd | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "Specify the tags as key/value pairs.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public Hashtable Tag { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #region Identity params | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = ByResourceGroup, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = ByResourceId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Parameter(Mandatory = false, ParameterSetName = ByInputObject, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+249
to
+253
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+250
to
+254
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | |
| [Parameter(Mandatory = false, ParameterSetName = ByResourceId, | |
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | |
| [Parameter(Mandatory = false, ParameterSetName = ByInputObject, | |
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssigned,UserAssigned.")] | |
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssignedUserAssigned.")] | |
| [Parameter(Mandatory = false, ParameterSetName = ByResourceId, | |
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssignedUserAssigned.")] | |
| [Parameter(Mandatory = false, ParameterSetName = ByInputObject, | |
| HelpMessage = "Specify the type of managed identity for the application. Options are None, SystemAssigned, UserAssigned, and SystemAssignedUserAssigned.")] |
Copilot
AI
Mar 11, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If -UserAssignedIdentityId is specified without also setting IdentityType to a value that includes UserAssigned, the cmdlet will set UserAssignedIdentities while leaving Identity.Type unchanged/unspecified, which can lead to an invalid request or ignored identities. Validate the dependency (require IdentityType include UserAssigned) or set Identity.Type automatically when UserAssignedIdentityId is provided.
| // Ensure the identity type includes UserAssigned when user-assigned identities are specified | |
| if (string.IsNullOrEmpty(currentApp.Identity.Type)) | |
| { | |
| currentApp.Identity.Type = "UserAssigned"; | |
| } | |
| else if (!currentApp.Identity.Type.Contains("UserAssigned", StringComparison.OrdinalIgnoreCase)) | |
| { | |
| currentApp.Identity.Type = currentApp.Identity.Type + ", UserAssigned"; | |
| } |
Copilot
AI
Mar 28, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When -UserAssignedIdentityId is bound, the cmdlet sets currentApp.Identity.UserAssignedIdentities but does not ensure currentApp.Identity.Type includes UserAssigned (and Identity may be newly created with Type == null). This can produce an invalid identity payload. Consider setting Identity.Type automatically when user-assigned IDs are provided (or enforcing that -IdentityType must be supplied alongside -UserAssignedIdentityId).
| ?.ToDictionary(id => id, id => new UserAssignedIdentity()); | |
| ?.ToDictionary(id => id, id => new UserAssignedIdentity()); | |
| // Ensure identity type includes UserAssigned when user-assigned identities are provided, | |
| // unless the caller explicitly specified -IdentityType. | |
| if (!this.IsParameterBound(c => c.IdentityType)) | |
| { | |
| var currentType = currentApp.Identity.Type; | |
| if (currentType == null || currentType == ManagedIdentityType.None) | |
| { | |
| currentApp.Identity.Type = ManagedIdentityType.UserAssigned; | |
| } | |
| else if (currentType == ManagedIdentityType.SystemAssigned) | |
| { | |
| currentApp.Identity.Type = ManagedIdentityType.SystemAssignedUserAssigned; | |
| } | |
| } |
Copilot
AI
Mar 28, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ApplicationManagedIdentity entries are cast with entry.Key as string / entry.Value as string. Non-string keys/values will become null and will trigger ApplicationUserAssignedIdentity.Validate() failures (Name/PrincipalId cannot be null). Add validation/conversion to ensure all hashtable keys/values are non-empty strings before constructing ApplicationUserAssignedIdentity objects.
| currentApp.ManagedIdentities = this.ApplicationManagedIdentity?.Cast<DictionaryEntry>() | |
| .Select(entry => new ApplicationUserAssignedIdentity( | |
| name: entry.Key as string, | |
| principalId: entry.Value as string)) | |
| .ToList(); | |
| if (this.ApplicationManagedIdentity != null) | |
| { | |
| var managedIdentities = new List<ApplicationUserAssignedIdentity>(); | |
| foreach (DictionaryEntry entry in this.ApplicationManagedIdentity) | |
| { | |
| if (entry.Key == null || entry.Value == null) | |
| { | |
| continue; | |
| } | |
| var nameString = entry.Key as string ?? entry.Key.ToString(); | |
| var principalIdString = entry.Value as string ?? entry.Value.ToString(); | |
| if (string.IsNullOrWhiteSpace(nameString) || string.IsNullOrWhiteSpace(principalIdString)) | |
| { | |
| continue; | |
| } | |
| managedIdentities.Add(new ApplicationUserAssignedIdentity( | |
| name: nameString, | |
| principalId: principalIdString)); | |
| } | |
| currentApp.ManagedIdentities = managedIdentities; | |
| } | |
| else | |
| { | |
| currentApp.ManagedIdentities = null; | |
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ChangeLog entry uses the acronym "SFMC" without expansion and includes double quotes around the API version. Per repo ChangeLog guidelines, expand less-obvious acronyms on first use and avoid problematic special characters like unescaped quotes (consider writing the version without quotes).