diff --git a/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/AzureResourceManagerContext.cs b/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/AzureResourceManagerContext.cs new file mode 100644 index 000000000000..054da6e9d545 --- /dev/null +++ b/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/AzureResourceManagerContext.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.ClientModel.Primitives; +using System.Collections.Generic; +using Azure.ResourceManager.Models; + +namespace Azure.ResourceManager +{ + public partial class AzureResourceManagerContext + { + partial void AddAdditionalFactories(Dictionary> factories) + { + factories.Add(typeof(ManagedServiceIdentity), () => new ManagedServiceIdentityTypeBuilder()); + } + + private class ManagedServiceIdentityTypeBuilder : ModelReaderWriterTypeBuilder + { + protected override Type BuilderType => typeof(ManagedServiceIdentity); + + protected override object CreateInstance() + { + return new ManagedServiceIdentity(ManagedServiceIdentityType.None); + } + } + } +} diff --git a/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs b/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs index e1d666459195..797c5334ce6c 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs +++ b/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs @@ -18,22 +18,55 @@ namespace Azure.ResourceManager.Models [JsonConverter(typeof(ManagedServiceIdentityConverter))] public partial class ManagedServiceIdentity : IJsonModel { - internal void Write(Utf8JsonWriter writer, ModelReaderWriterOptions options, JsonSerializerOptions jOptions = default) + private const string SystemAssignedUserAssignedV3Value = "SystemAssigned,UserAssigned"; + + // This method checks if the format string in options.Format ends with the "|v3" suffix. + // The "|v3" suffix indicates that the ManagedServiceIdentityType format is version 3. + // If the suffix is present, it is removed, and the base format is returned via the 'format' parameter. + // This allows the method to handle version-specific logic while preserving the base format. + private static bool UseManagedServiceIdentityV3(ModelReaderWriterOptions options, out string format) + { + var originalFormat = options.Format.AsSpan(); + if (originalFormat.Length > 3) + { + var v3Format = "|v3".AsSpan(); + if (originalFormat.EndsWith(v3Format)) + { + format = originalFormat.Slice(0, originalFormat.Length - v3Format.Length).ToString(); + return true; + } + } + + format = options.Format; + return false; + } + + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + var useManagedServiceIdentityV3 = UseManagedServiceIdentityV3(options, out string optionsFormat); + var format = optionsFormat == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : optionsFormat; if (format != "J") { throw new FormatException($"The model {nameof(ManagedServiceIdentity)} does not support '{format}' format."); } writer.WriteStartObject(); - JsonSerializer.Serialize(writer, ManagedServiceIdentityType, jOptions); - if (options.Format != "W" && Optional.IsDefined(PrincipalId)) + writer.WritePropertyName("type"u8); + if (useManagedServiceIdentityV3 && ManagedServiceIdentityType == ManagedServiceIdentityType.SystemAssignedUserAssigned) + { + writer.WriteStringValue(SystemAssignedUserAssignedV3Value); + } + else + { + writer.WriteStringValue(ManagedServiceIdentityType.ToString()); + } + + if (optionsFormat != "W" && Optional.IsDefined(PrincipalId)) { writer.WritePropertyName("principalId"u8); writer.WriteStringValue(PrincipalId.Value); } - if (options.Format != "W" && Optional.IsDefined(TenantId)) + if (optionsFormat != "W" && Optional.IsDefined(TenantId)) { writer.WritePropertyName("tenantId"u8); writer.WriteStringValue(TenantId.Value); @@ -45,21 +78,24 @@ internal void Write(Utf8JsonWriter writer, ModelReaderWriterOptions options, Jso foreach (var item in UserAssignedIdentities) { writer.WritePropertyName(item.Key); - JsonSerializer.Serialize(writer, item.Value); + if (item.Value is null) + { + writer.WriteNullValue(); + } + else + { + ((IJsonModel)item.Value).Write(writer, new ModelReaderWriterOptions(optionsFormat)); + } } writer.WriteEndObject(); } writer.WriteEndObject(); } - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) - { - Write(writer, options, null); - } - ManagedServiceIdentity IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + UseManagedServiceIdentityV3(options, out string optionsFormat); + var format = optionsFormat == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : optionsFormat; if (format != "J") { throw new FormatException($"The model {nameof(ManagedServiceIdentity)} does not support '{format}' format."); @@ -71,7 +107,8 @@ ManagedServiceIdentity IJsonModel.Create(ref Utf8JsonRea BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + UseManagedServiceIdentityV3(options, out string optionsFormat); + var format = optionsFormat == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : optionsFormat; switch (format) { @@ -80,7 +117,7 @@ BinaryData IPersistableModel.Write(ModelReaderWriterOpti case "bicep": return SerializeBicep(options); default: - throw new FormatException($"The model {nameof(ManagedServiceIdentity)} does not support '{options.Format}' format."); + throw new FormatException($"The model {nameof(ManagedServiceIdentity)} does not support '{format}' format."); } } @@ -168,14 +205,17 @@ private void AppendChildObject(StringBuilder stringBuilder, object childObject, } } - internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonElement element, ModelReaderWriterOptions options, JsonSerializerOptions jOptions) + internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonElement element, ModelReaderWriterOptions options = null) { options ??= new ModelReaderWriterOptions("W"); + var useManagedServiceIdentityV3 = UseManagedServiceIdentityV3(options, out string format); + options = new ModelReaderWriterOptions(format); if (element.ValueKind == JsonValueKind.Null) { return null; } + Guid? principalId = default; Guid? tenantId = default; ManagedServiceIdentityType type = default; @@ -202,7 +242,15 @@ internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonEle } if (property.NameEquals("type"u8)) { - type = JsonSerializer.Deserialize($"{{{property}}}", jOptions); + var propertyValue = property.Value.GetString(); + if (useManagedServiceIdentityV3 && propertyValue == SystemAssignedUserAssignedV3Value) + { + type = ManagedServiceIdentityType.SystemAssignedUserAssigned; + } + else + { + type = new ManagedServiceIdentityType(propertyValue); + } continue; } if (property.NameEquals("userAssignedIdentities"u8)) @@ -214,7 +262,7 @@ internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonEle Dictionary dictionary = new Dictionary(); foreach (var property0 in property.Value.EnumerateObject()) { - dictionary.Add(new ResourceIdentifier(property0.Name), JsonSerializer.Deserialize(property0.Value.GetRawText())); + dictionary.Add(new ResourceIdentifier(property0.Name), ModelReaderWriter.Read(new BinaryData(Encoding.UTF8.GetBytes(property0.Value.GetRawText())), options, AzureResourceManagerContext.Default)); } userAssignedIdentities = dictionary; continue; @@ -223,14 +271,11 @@ internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonEle return new ManagedServiceIdentity(principalId, tenantId, type, userAssignedIdentities ?? new ChangeTrackingDictionary()); } - internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonElement element, ModelReaderWriterOptions options = null) - { - return DeserializeManagedServiceIdentity(element, options, null); - } - ManagedServiceIdentity IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) { - var format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + options ??= new ModelReaderWriterOptions("W"); + var useManagedServiceIdentityV3 = UseManagedServiceIdentityV3(options, out string optionsFormat); + var format = optionsFormat == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : optionsFormat; switch (format) { @@ -240,7 +285,7 @@ ManagedServiceIdentity IPersistableModel.Create(BinaryDa return DeserializeManagedServiceIdentity(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ManagedServiceIdentity)} does not support '{options.Format}' format."); + throw new FormatException($"The model {nameof(ManagedServiceIdentity)} does not support '{format}' format."); } } @@ -248,14 +293,22 @@ ManagedServiceIdentity IPersistableModel.Create(BinaryDa internal partial class ManagedServiceIdentityConverter : JsonConverter { + private static readonly ModelReaderWriterOptions V3Options = new ModelReaderWriterOptions("W|v3"); + + // This method checks if the ManagedServiceIdentityTypeV3Converter exists and it indicates that the ManagedServiceIdentityType format is version 3. + // Then, the format string in options.Format should be "W|v3", otherwise the default options.Format is "W". + // TODO: Remove this method when ManagedServiceIdentityTypeV3Converter is removed from the codebase after we apply the latest genertor changes. + private bool UseManagedServiceIdentityV3(JsonSerializerOptions options) + => options is not null && options.Converters.Any(x => x.ToString().EndsWith("ManagedServiceIdentityTypeV3Converter")); + public override void Write(Utf8JsonWriter writer, ManagedServiceIdentity model, JsonSerializerOptions options) { - model.Write(writer, new ModelReaderWriterOptions("W"), options); + ((IJsonModel)model).Write(writer, UseManagedServiceIdentityV3(options) ? V3Options : new ModelReaderWriterOptions("W")); } public override ManagedServiceIdentity Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var document = JsonDocument.ParseValue(ref reader); - return DeserializeManagedServiceIdentity(document.RootElement, null, options); + return DeserializeManagedServiceIdentity(document.RootElement, UseManagedServiceIdentityV3(options) ? V3Options : null); } } } diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Scenario/PolicyAssignmentCollectionTests.cs b/sdk/resourcemanager/Azure.ResourceManager/tests/Scenario/PolicyAssignmentCollectionTests.cs index 01446fbb5208..fab53a5dcaaf 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Scenario/PolicyAssignmentCollectionTests.cs +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Scenario/PolicyAssignmentCollectionTests.cs @@ -4,11 +4,8 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Azure.Core; using Azure.Core.TestFramework; using Azure.ResourceManager.ManagementGroups; -using Azure.ResourceManager.ManagementGroups.Models; -using Azure.ResourceManager.Models; using Azure.ResourceManager.Resources; using Azure.ResourceManager.Resources.Models; using NUnit.Framework; @@ -112,45 +109,12 @@ public async Task Get() Assert.ThrowsAsync(async () => _ = await rg.GetPolicyAssignments().GetAsync(null)); } -#pragma warning disable CS0618 // This type is obsolete and will be removed in a future release. - [TestCase] - [RecordedTest] - public async Task TestManagedIdentity() - { - SubscriptionResource subscription = await Client.GetDefaultSubscriptionAsync(); - string rgName = Recording.GenerateAssetName("testRg-"); - ResourceGroupResource rg = await CreateResourceGroup(subscription, rgName); - string policyAssignmentName = Recording.GenerateAssetName("polAssign-"); - PolicyAssignmentData input = new PolicyAssignmentData - { - DisplayName = $"Test ${policyAssignmentName}", - PolicyDefinitionId = "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d", - Identity = new SystemAssignedServiceIdentity(SystemAssignedServiceIdentityType.SystemAssigned), - Location = AzureLocation.WestUS - }; - Assert.AreEqual(SystemAssignedServiceIdentityType.SystemAssigned, input.Identity.SystemAssignedServiceIdentityType); - Assert.AreEqual(ManagedServiceIdentityType.SystemAssigned, input.ManagedIdentity.ManagedServiceIdentityType); - ArmOperation lro = await rg.GetPolicyAssignments().CreateOrUpdateAsync(WaitUntil.Completed, policyAssignmentName, input); - PolicyAssignmentResource policyAssignment = lro.Value; - Assert.AreEqual(policyAssignmentName, policyAssignment.Data.Name); - Assert.AreEqual(policyAssignment.Data.Identity.PrincipalId, policyAssignment.Data.ManagedIdentity.PrincipalId); - Assert.AreEqual(policyAssignment.Data.Identity.TenantId, policyAssignment.Data.ManagedIdentity.TenantId); - Assert.AreEqual(ManagedServiceIdentityType.SystemAssigned, policyAssignment.Data.ManagedIdentity.ManagedServiceIdentityType); - Assert.AreEqual(SystemAssignedServiceIdentityType.SystemAssigned, policyAssignment.Data.Identity.SystemAssignedServiceIdentityType); - policyAssignment.Data.ManagedIdentity.ManagedServiceIdentityType = ManagedServiceIdentityType.None; - lro = await policyAssignment.UpdateAsync(WaitUntil.Completed, policyAssignment.Data); - PolicyAssignmentResource updatedPolicyAssignment = lro.Value; - Assert.AreEqual(ManagedServiceIdentityType.None, updatedPolicyAssignment.Data.ManagedIdentity.ManagedServiceIdentityType); - Assert.AreEqual(SystemAssignedServiceIdentityType.None, updatedPolicyAssignment.Data.Identity.SystemAssignedServiceIdentityType); - } - private void AssertValidPolicyAssignment(PolicyAssignmentResource model, PolicyAssignmentResource getResult) { Assert.AreEqual(model.Data.Name, getResult.Data.Name); Assert.AreEqual(model.Data.Id, getResult.Data.Id); Assert.AreEqual(model.Data.ResourceType, getResult.Data.ResourceType); Assert.AreEqual(model.Data.Location, getResult.Data.Location); - Assert.AreEqual(model.Data.Identity, getResult.Data.Identity); Assert.AreEqual(model.Data.DisplayName, getResult.Data.DisplayName); Assert.AreEqual(model.Data.PolicyDefinitionId, getResult.Data.PolicyDefinitionId); Assert.AreEqual(model.Data.Scope, getResult.Data.Scope); @@ -181,6 +145,5 @@ private void AssertValidPolicyAssignment(PolicyAssignmentResource model, PolicyA } } } -#pragma warning restore CS0618 // This type is obsolete and will be removed in a future release. } } diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/JsonAsserts.cs b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/JsonAsserts.cs index 41dc049adf15..4653847a3370 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/JsonAsserts.cs +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/JsonAsserts.cs @@ -1,9 +1,12 @@ +using System.ClientModel.Primitives; using System.IO; using System.Text; using System.Text.Json; using Azure.Core; using NUnit.Framework; +#nullable enable + namespace Azure.ResourceManager.Tests { internal static class JsonAsserts @@ -22,13 +25,14 @@ public static void AssertSerialization(string expected, IUtf8JsonSerializable se Assert.AreEqual(expected, text); } - public static void AssertConverterSerialization(string expected, object model, JsonSerializerOptions options = default) + public static void AssertConverterSerialization(string expected, T model, ModelReaderWriterOptions? options = null) { using var memoryStream = new MemoryStream(); using (var writer = new Utf8JsonWriter(memoryStream)) { - JsonSerializer.Serialize(writer, model, options); + var jsonModel = model as IJsonModel; + jsonModel?.Write(writer, options ?? new ModelReaderWriterOptions("W")); } var text = Encoding.UTF8.GetString(memoryStream.ToArray()); diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs index 6e9b9de4917f..4f5ef60c9817 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs @@ -1,4 +1,5 @@ using System; +using System.ClientModel.Primitives; using System.Collections.Generic; using System.IO; using System.Linq; @@ -8,40 +9,44 @@ using Azure.ResourceManager.Models; using NUnit.Framework; +#nullable enable + namespace Azure.ResourceManager.Tests { [Parallelizable] public class ManagedServiceIdentityTests { private static readonly string TestAssetPath = Path.Combine(TestContext.CurrentContext.TestDirectory, "Unit", "TestAssets", "Identity"); + private static readonly ModelReaderWriterOptions V3Options = new ModelReaderWriterOptions("W|v3"); - public JsonProperty DeserializerHelper(string filename) + private JsonElement DeserializerHelper(string filename, out string json) { - var json = File.ReadAllText(Path.Combine(TestAssetPath, filename)); - using JsonDocument document = JsonDocument.Parse(json); - JsonElement rootElement = document.RootElement.Clone(); - return rootElement.EnumerateObject().First(); + var originalJson = File.ReadAllText(Path.Combine(TestAssetPath, filename)); + json = originalJson.Replace("\r\n", "").Replace("\n", "").Replace(" ", "").Replace("'principalId':'22fdaec1-8b9f-49dc-bd72-ddaf8f215577','tenantId':'72f988af-86f1-41af-91ab-2d7cd011db47',".Replace('\'', '\"'), ""); + using JsonDocument document = JsonDocument.Parse(originalJson); + return document.RootElement.Clone(); } [TestCase] public void TestDeserializerInvalidDefaultJson() { JsonElement invalid = default(JsonElement); - Assert.Throws(delegate { ManagedServiceIdentity.DeserializeManagedServiceIdentity(invalid); }); + Assert.Throws(delegate + { ManagedServiceIdentity.DeserializeManagedServiceIdentity(invalid); }); } [TestCase] public void TestDeserializerInvalidNullType() { - var identityJsonProperty = DeserializerHelper("InvalidTypeIsNull.json"); - Assert.AreEqual(default(ManagedServiceIdentityType), ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value).ManagedServiceIdentityType); + var identityJsonProperty = DeserializerHelper("InvalidTypeIsNull.json", out _); + Assert.AreEqual(default(ManagedServiceIdentityType), ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty).ManagedServiceIdentityType); } [TestCase] public void TestDeserializerInvalidType() { - var identityJsonProperty = DeserializerHelper("InvalidType.json"); - ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + var identityJsonProperty = DeserializerHelper("InvalidType.json", out _); + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); var user = back.UserAssignedIdentities; Assert.AreEqual("/subscriptions/d96407f5-db8f-4325-b582-84ad21310bd8/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity", user.Keys.First().ToString()); Assert.AreEqual("9a2eaa6a-b49c-4a63-afb5-3b72e3e65422", user.Values.First().ClientId.ToString()); @@ -51,8 +56,8 @@ public void TestDeserializerInvalidType() [TestCase] public void TestDeserializerNoneWithEmptyStringIds() { - var identityJsonProperty = DeserializerHelper("NoneEmptyStringIds.json"); - var msi = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + var identityJsonProperty = DeserializerHelper("NoneEmptyStringIds.json", out _); + var msi = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); Assert.IsNull(msi.PrincipalId); Assert.IsNull(msi.TenantId); } @@ -60,8 +65,8 @@ public void TestDeserializerNoneWithEmptyStringIds() [TestCase] public void TestDeserializerValidInnerExtraField() { - var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedInnerExtraField.json"); - ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedInnerExtraField.json", out _); + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); Assert.IsTrue("22fddec1-8b9f-49dc-bd72-ddaf8f215577".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988bf-86f1-41af-91ab-2d7cd011db47".Equals(back.TenantId.ToString())); var user = back.UserAssignedIdentities; @@ -73,8 +78,8 @@ public void TestDeserializerValidInnerExtraField() [TestCase] public void TestDeserializerValidMiddleExtraField() { - var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedMiddleExtraField.json"); - ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedMiddleExtraField.json", out _); + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); Assert.IsTrue("22fddec1-8b9f-49dc-bd72-ddaf8f215577".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988bf-86f1-41af-91ab-2d7cd011db47".Equals(back.TenantId.ToString())); var user = back.UserAssignedIdentities; @@ -102,8 +107,8 @@ public void TestDeserializerValidOuterExtraField() [TestCase] public void TestDeserializerValidSystemAndMultUser() { - var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValidMultIdentities.json"); - ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValidMultIdentities.json", out _); + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); Assert.IsTrue("22fddec1-8b9f-49dc-bd72-ddaf8f215570".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988bf-86f1-41af-91ab-2d7cd011db40".Equals(back.TenantId.ToString())); var user = back.UserAssignedIdentities; @@ -118,8 +123,8 @@ public void TestDeserializerValidSystemAndMultUser() [TestCase] public void TestDeserializerValidSystemAssigned() { - var identityJsonProperty = DeserializerHelper("SystemAssigned.json"); - ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + var identityJsonProperty = DeserializerHelper("SystemAssigned.json", out _); + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); Assert.IsTrue("22fddec1-8b9f-49dc-bd72-ddaf8f215577".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988bf-86f1-41af-91ab-2d7cd011db47".Equals(back.TenantId.ToString())); Assert.IsTrue(back.UserAssignedIdentities.Count == 0); @@ -128,8 +133,8 @@ public void TestDeserializerValidSystemAssigned() [TestCase] public void TestDeserializerValidUserAssigned() { - var identityJsonProperty = DeserializerHelper("UserAssigned.json"); - ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + var identityJsonProperty = DeserializerHelper("UserAssigned.json", out _); + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); Assert.IsNull(back.PrincipalId); Assert.IsNull(back.TenantId); var user = back.UserAssignedIdentities; @@ -141,31 +146,25 @@ public void TestDeserializerValidUserAssigned() [TestCase] public void TestDeserializerValidSystemAndUserAssigned() { - var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValid.json"); - ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); - //ManagedServiceIdentity back = JsonSerializer.Deserialize(identityJsonProperty.Value.ToString()); + var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValid.json", out _); + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty); Assert.IsTrue("22fdaec1-8b9f-49dc-bd72-ddaf8f215577".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988af-86f1-41af-91ab-2d7cd011db47".Equals(back.TenantId.ToString())); var user = back.UserAssignedIdentities; Assert.AreEqual("/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity", user.Keys.First().ToString()); - Assert.AreEqual("9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", user.Values.First().ClientId.ToString()); - Assert.AreEqual("77563a98-c9d9-407b-a7af-592d21fa2153", user.Values.First().PrincipalId.ToString()); Assert.AreEqual("SystemAssigned, UserAssigned", back.ManagedServiceIdentityType.ToString()); } [TestCase] public void TestDeserializerValidSystemAndUserAssignedV3() { - var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValidV3.json"); - var identityJson = identityJsonProperty.Value.ToString(); - var serializeOptions = new JsonSerializerOptions { Converters = { new ManagedServiceIdentityTypeV3Converter() } }; - ManagedServiceIdentity back = JsonSerializer.Deserialize(identityJson, serializeOptions); + var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValidV3.json", out _); + var identityJson = identityJsonProperty.ToString(); + ManagedServiceIdentity back = Deserialize(identityJson, V3Options); Assert.IsTrue("22fdaec1-8b9f-49dc-bd72-ddaf8f215577".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988af-86f1-41af-91ab-2d7cd011db47".Equals(back.TenantId.ToString())); var user = back.UserAssignedIdentities; Assert.AreEqual("/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity", user.Keys.First().ToString()); - Assert.AreEqual("9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", user.Values.First().ClientId.ToString()); - Assert.AreEqual("77563a98-c9d9-407b-a7af-592d21fa2153", user.Values.First().PrincipalId.ToString()); Assert.IsTrue(identityJson.Contains("SystemAssigned,UserAssigned")); Assert.AreEqual("SystemAssigned, UserAssigned", back.ManagedServiceIdentityType.ToString()); } @@ -200,66 +199,49 @@ public void TestSerializerValidSystemAndUserV3() "\"userAssignedIdentities\":" + "{" + "\"/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity\":" + user + "}}"; - var serializeOptions = new JsonSerializerOptions { Converters = { new ManagedServiceIdentityTypeV3Converter() } }; - JsonAsserts.AssertConverterSerialization(expected, identity, serializeOptions); + JsonAsserts.AssertConverterSerialization(expected, identity, V3Options); } [TestCase] public void TestDeserializeFromV4AndSerializeToV3SystemAndUser() { //Deserialize from v4 - var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValid.json"); - var identityJsonV4 = identityJsonProperty.Value.ToString(); + var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValid.json", out string expectedV4); + var identityJsonV4 = identityJsonProperty.ToString(); Assert.IsTrue(identityJsonV4.Contains("SystemAssigned, UserAssigned")); - ManagedServiceIdentity back = JsonSerializer.Deserialize(identityJsonV4); + ManagedServiceIdentity back = Deserialize(identityJsonV4); var userIdentities = back.UserAssignedIdentities; Assert.IsTrue("22fdaec1-8b9f-49dc-bd72-ddaf8f215577".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988af-86f1-41af-91ab-2d7cd011db47".Equals(back.TenantId.ToString())); Assert.AreEqual("/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity", userIdentities.Keys.First().ToString()); - Assert.AreEqual("9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", userIdentities.Values.First().ClientId.ToString()); - Assert.AreEqual("77563a98-c9d9-407b-a7af-592d21fa2153", userIdentities.Values.First().PrincipalId.ToString()); Assert.AreEqual("SystemAssigned, UserAssigned", back.ManagedServiceIdentityType.ToString()); //Serialize to v3 - string user = "{}"; - string expectedV3 = "{" + - "\"type\":\"SystemAssigned,UserAssigned\"," + - "\"userAssignedIdentities\":" + - "{" + "\"/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity\":" + - user + "}}"; - var serializeOptions = new JsonSerializerOptions { Converters = { new ManagedServiceIdentityTypeV3Converter() } }; - JsonAsserts.AssertConverterSerialization(expectedV3, back, serializeOptions); + var expectedV3 = expectedV4.Replace("SystemAssigned, UserAssigned", "SystemAssigned,UserAssigned"); + JsonAsserts.AssertConverterSerialization(expectedV3, back, V3Options); } [TestCase] public void TestDeserializeFromV3AndSerializeToV4SystemAndUser() { //Deserialize from v3 - var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValidV3.json"); - var identityJsonV3 = identityJsonProperty.Value.ToString(); + var identityJsonProperty = DeserializerHelper("SystemAndUserAssignedValidV3.json", out string expectedV3); + var identityJsonV3 = identityJsonProperty.ToString(); Assert.IsTrue(identityJsonV3.Contains("SystemAssigned,UserAssigned")); - var serializeOptions = new JsonSerializerOptions { Converters = { new ManagedServiceIdentityTypeV3Converter() } }; - ManagedServiceIdentity back = JsonSerializer.Deserialize(identityJsonV3, serializeOptions); + ManagedServiceIdentity back = Deserialize(identityJsonV3, V3Options); var userIdentities = back.UserAssignedIdentities; Assert.IsTrue("22fdaec1-8b9f-49dc-bd72-ddaf8f215577".Equals(back.PrincipalId.ToString())); Assert.IsTrue("72f988af-86f1-41af-91ab-2d7cd011db47".Equals(back.TenantId.ToString())); Assert.AreEqual("/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity", userIdentities.Keys.First().ToString()); - Assert.AreEqual("9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", userIdentities.Values.First().ClientId.ToString()); - Assert.AreEqual("77563a98-c9d9-407b-a7af-592d21fa2153", userIdentities.Values.First().PrincipalId.ToString()); Assert.AreEqual("SystemAssigned, UserAssigned", back.ManagedServiceIdentityType.ToString()); //Serialize to v4 - string user = "{}"; - string expectedV4 = "{" + - "\"type\":\"SystemAssigned, UserAssigned\"," + - "\"userAssignedIdentities\":" + - "{" + "\"/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity\":" + - user + "}}"; + string expectedV4 = expectedV3.Replace("SystemAssigned,UserAssigned", "SystemAssigned, UserAssigned"); JsonAsserts.AssertConverterSerialization(expectedV4, back); } [TestCase] public void TestSerializerNullUserAssignedIdentity() { - var dict1 = new Dictionary(); + var dict1 = new Dictionary(); dict1[new ResourceIdentifier("/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity")] = null; ManagedServiceIdentity identity = new ManagedServiceIdentity(new Guid("de29bab1-49e1-4705-819b-4dfddceaaa98"), new Guid("72f988bf-86f1-41af-91ab-2d7cd011db47"), ManagedServiceIdentityType.SystemAssignedUserAssigned, dict1); string user = "null"; @@ -281,14 +263,14 @@ public void TestSerializerValidSystemAndMultUser() dict1[new ResourceIdentifier("/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity1")] = userAssignedIdentity1; dict1[new ResourceIdentifier("/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity2")] = userAssignedIdentity2; ManagedServiceIdentity identity = new ManagedServiceIdentity(new Guid("de29bab1-49e1-4705-819b-4dfddceaaa98"), new Guid("72f988bf-86f1-41af-91ab-2d7cd011db47"), ManagedServiceIdentityType.SystemAssignedUserAssigned, dict1); - string emptyUser = "{}"; + string user = "{}"; string expected = "{" + "\"type\":\"SystemAssigned, UserAssigned\"," + "\"userAssignedIdentities\":" + "{" + "\"/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity1\":" + - emptyUser + "," + + user + "," + "\"/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity2\":" + - emptyUser + "}}"; + user + "}}"; JsonAsserts.AssertConverterSerialization(expected, identity); } @@ -316,7 +298,10 @@ public void TestSerializerValidUserNullSystem() "{" + "\"/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity\":" + user + "}}"; - JsonAsserts.AssertConverterSerialization(expected, identity); + JsonAsserts.AssertConverterSerialization(expected, identity, V3Options); } + + private ManagedServiceIdentity Deserialize(string json, ModelReaderWriterOptions? options = null) + => ModelReaderWriter.Read(new BinaryData(Encoding.UTF8.GetBytes(json)), options ?? ModelReaderWriterOptions.Json, AzureResourceManagerContext.Default)!; } } diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/InvalidType.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/InvalidType.json index 6441e019508f..cb6689d9853f 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/InvalidType.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/InvalidType.json @@ -1,5 +1,4 @@ { - "identity": { "principalId": "22fddec1-8b9f-49dc-bd72-ddaf8f215577", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "type": "Test", @@ -9,5 +8,4 @@ "principalId": "77563a98-c9d9-4f7b-a7af-592d21fa2153" } } - } } diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/NoneEmptyStringIds.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/NoneEmptyStringIds.json index 5064def489d3..c3ae3ac12799 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/NoneEmptyStringIds.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/NoneEmptyStringIds.json @@ -1,8 +1,5 @@ { - "identity": { - "principalId": "", - "tenantId": "", - "type": "None" - } - } - \ No newline at end of file + "principalId": "", + "tenantId": "", + "type": "None" +} diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedInnerExtraField.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedInnerExtraField.json index ccdfa20449dd..f485dd87a445 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedInnerExtraField.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedInnerExtraField.json @@ -1,14 +1,12 @@ { - "identity": { - "extraId" : "test", + "extraId": "test", "principalId": "22fddec1-8b9f-49dc-bd72-ddaf8f215577", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "type": "SystemAssigned, UserAssigned", "userAssignedIdentities": { - "/subscriptions/db1ab6f0-4769-4b27-9dde-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { - "clientId": "9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", - "principalId": "77563a98-c9d9-407b-a7af-592d21fa2153" - } + "/subscriptions/db1ab6f0-4769-4b27-9dde-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { + "clientId": "9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", + "principalId": "77563a98-c9d9-407b-a7af-592d21fa2153" + } } - } } diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedMiddleExtraField.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedMiddleExtraField.json index 25bd5585dfdf..f83be0129981 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedMiddleExtraField.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedMiddleExtraField.json @@ -1,14 +1,12 @@ { - "identity": { "principalId": "22fddec1-8b9f-49dc-bd72-ddaf8f215577", "extraId": "test", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "type": "SystemAssigned, UserAssigned", "userAssignedIdentities": { - "/subscriptions/db1ab6f0-4769-4b27-9dde-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { - "clientId": "9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", - "principalId": "77563a98-c9d9-407b-a7af-592d21fa2153" - } + "/subscriptions/db1ab6f0-4769-4b27-9dde-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { + "clientId": "9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", + "principalId": "77563a98-c9d9-407b-a7af-592d21fa2153" + } } - } } diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValid.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValid.json index f97d72a0baad..64b50830b81c 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValid.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValid.json @@ -1,13 +1,8 @@ { - "identity": { + "type": "SystemAssigned, UserAssigned", "principalId": "22fdaec1-8b9f-49dc-bd72-ddaf8f215577", "tenantId": "72f988af-86f1-41af-91ab-2d7cd011db47", - "type": "SystemAssigned, UserAssigned", "userAssignedIdentities": { - "/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { - "clientId": "9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", - "principalId": "77563a98-c9d9-407b-a7af-592d21fa2153" - } + "/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": {} } - } -} \ No newline at end of file +} diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidMultIdentities.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidMultIdentities.json index f8084ae97d51..d38c2be6e526 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidMultIdentities.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidMultIdentities.json @@ -1,5 +1,4 @@ { - "identity": { "principalId": "22fddec1-8b9f-49dc-bd72-ddaf8f215570", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db40", "type": "SystemAssigned, UserAssigned", @@ -13,5 +12,4 @@ "principalId": "77563a98-c9d9-477b-a7af-592d2bfa2150" } } - } } diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidV3.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidV3.json index dc51a733e3e6..d27f13ff3954 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidV3.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAndUserAssignedValidV3.json @@ -1,13 +1,8 @@ { - "identity": { + "type": "SystemAssigned,UserAssigned", "principalId": "22fdaec1-8b9f-49dc-bd72-ddaf8f215577", "tenantId": "72f988af-86f1-41af-91ab-2d7cd011db47", - "type": "SystemAssigned,UserAssigned", "userAssignedIdentities": { - "/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { - "clientId": "9a9eaa6a-b49c-4c63-afb5-3b72e3e65422", - "principalId": "77563a98-c9d9-407b-a7af-592d21fa2153" - } + "/subscriptions/db1ab6f0-4769-4aa7-930e-01e2ef9c123c/resourceGroups/tester/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": {} } - } -} \ No newline at end of file +} diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAssigned.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAssigned.json index c2b4015987ee..d6edea676335 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAssigned.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/SystemAssigned.json @@ -1,7 +1,5 @@ { - "identity": { "principalId": "22fddec1-8b9f-49dc-bd72-ddaf8f215577", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "type": "SystemAssigned" - } -} +} diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/UserAssigned.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/UserAssigned.json index a0976d9bc0da..a6f3721ff392 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/UserAssigned.json +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/UserAssigned.json @@ -1,11 +1,9 @@ { - "identity": { "type": "UserAssigned", "userAssignedIdentities": { - "/subscriptions/db1ab6f0-4769-4b2e-930e-01e2ef9c123c/resourceGroups/tester-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { - "clientId": "9a2eaa6a-b49c-4c63-afb5-3b72e3e65422", - "principalId": "77563a98-c9d9-477b-a7af-592d21fa2153" - } + "/subscriptions/db1ab6f0-4769-4b2e-930e-01e2ef9c123c/resourceGroups/tester-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testidentity": { + "clientId": "9a2eaa6a-b49c-4c63-afb5-3b72e3e65422", + "principalId": "77563a98-c9d9-477b-a7af-592d21fa2153" + } } - } }