From e929616278c8c3706ee64f26e583089881792af5 Mon Sep 17 00:00:00 2001 From: aayushsingh2502 Date: Mon, 22 Jun 2026 16:55:33 +0530 Subject: [PATCH 1/7] list and identity implementation - azurerm_user_assigned_identity --- .../services/managedidentity/registration.go | 4 +- .../user_assigned_identity_resource.go | 59 ++++++--- .../user_assigned_identity_resource_list.go | 123 ++++++++++++++++++ ...er_assigned_identity_resource_list_test.go | 100 ++++++++++++++ .../user_assigned_identity.html.markdown | 40 ++++++ 5 files changed, 306 insertions(+), 20 deletions(-) create mode 100644 internal/services/managedidentity/user_assigned_identity_resource_list.go create mode 100644 internal/services/managedidentity/user_assigned_identity_resource_list_test.go create mode 100644 website/docs/list-resources/user_assigned_identity.html.markdown diff --git a/internal/services/managedidentity/registration.go b/internal/services/managedidentity/registration.go index 18851767f699..4ebd35d7e6c1 100644 --- a/internal/services/managedidentity/registration.go +++ b/internal/services/managedidentity/registration.go @@ -76,5 +76,7 @@ func (r Registration) EphemeralResources() []func() ephemeral.EphemeralResource } func (r Registration) ListResources() []sdk.FrameworkListWrappedResource { - return []sdk.FrameworkListWrappedResource{} + return []sdk.FrameworkListWrappedResource{ + UserAssignedIdentityListResource{}, + } } diff --git a/internal/services/managedidentity/user_assigned_identity_resource.go b/internal/services/managedidentity/user_assigned_identity_resource.go index 0a122dfda66a..3faa229735c7 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource.go +++ b/internal/services/managedidentity/user_assigned_identity_resource.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/go-azure-helpers/resourcemanager/commonids" "github.com/hashicorp/go-azure-helpers/resourcemanager/commonschema" "github.com/hashicorp/go-azure-helpers/resourcemanager/location" + "github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids" "github.com/hashicorp/go-azure-helpers/resourcemanager/tags" "github.com/hashicorp/go-azure-sdk/resource-manager/managedidentity/2024-11-30/identities" "github.com/hashicorp/terraform-provider-azurerm/internal/sdk" @@ -21,13 +22,20 @@ import ( "github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation" ) +//go:generate go run ../../tools/generator-tests resourceidentity -resource-name user_assigned_identity -service-package-name managedidentity -properties "name,resource_group_name" -known-values "subscription_id:data.Subscriptions.Primary" + var ( _ sdk.Resource = UserAssignedIdentityResource{} + _ sdk.ResourceWithIdentity = UserAssignedIdentityResource{} _ sdk.ResourceWithStateMigration = UserAssignedIdentityResource{} ) type UserAssignedIdentityResource struct{} +func (r UserAssignedIdentityResource) Identity() resourceids.ResourceId { + return &commonids.UserAssignedIdentityId{} +} + func (r UserAssignedIdentityResource) StateUpgraders() sdk.StateUpgradeData { return sdk.StateUpgradeData{ SchemaVersion: 1, @@ -144,6 +152,9 @@ func (r UserAssignedIdentityResource) Create() sdk.ResourceFunc { } metadata.SetID(id) + if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, &id); err != nil { + return err + } return nil }, } @@ -154,7 +165,6 @@ func (r UserAssignedIdentityResource) Read() sdk.ResourceFunc { Timeout: 5 * time.Minute, Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { client := metadata.Client.ManagedIdentity.V20241130.Identities - schema := UserAssignedIdentityResourceSchema{} id, err := commonids.ParseUserAssignedIdentityID(metadata.ResourceData.Id()) if err != nil { @@ -169,24 +179,7 @@ func (r UserAssignedIdentityResource) Read() sdk.ResourceFunc { return fmt.Errorf("retrieving %s: %+v", *id, err) } - if model := resp.Model; model != nil { - schema.Name = id.UserAssignedIdentityName - schema.ResourceGroupName = id.ResourceGroupName - schema.Location = location.Normalize(model.Location) - schema.Tags = tags.Flatten(model.Tags) - - if model.Properties != nil { - schema.ClientId = pointer.From(model.Properties.ClientId) - schema.PrincipalId = pointer.From(model.Properties.PrincipalId) - schema.TenantId = pointer.From(model.Properties.TenantId) - - if isolationScope := pointer.FromEnum(model.Properties.IsolationScope); isolationScope != string(identities.IsolationScopeNone) { - schema.IsolationScope = isolationScope - } - } - } - - return metadata.Encode(&schema) + return r.flatten(metadata, id, resp.Model) }, } } @@ -248,3 +241,31 @@ func (r UserAssignedIdentityResource) Update() sdk.ResourceFunc { }, } } + +func (r UserAssignedIdentityResource) flatten(metadata sdk.ResourceMetaData, id *commonids.UserAssignedIdentityId, model *identities.Identity) error { + state := UserAssignedIdentityResourceSchema{ + Name: id.UserAssignedIdentityName, + ResourceGroupName: id.ResourceGroupName, + } + + if model != nil { + state.Location = location.Normalize(model.Location) + state.Tags = tags.Flatten(model.Tags) + + if model.Properties != nil { + state.ClientId = pointer.From(model.Properties.ClientId) + state.PrincipalId = pointer.From(model.Properties.PrincipalId) + state.TenantId = pointer.From(model.Properties.TenantId) + + if isolationScope := pointer.FromEnum(model.Properties.IsolationScope); isolationScope != string(identities.IsolationScopeNone) { + state.IsolationScope = isolationScope + } + } + } + + if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, id); err != nil { + return err + } + + return metadata.Encode(&state) +} diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list.go b/internal/services/managedidentity/user_assigned_identity_resource_list.go new file mode 100644 index 000000000000..2f6be8f23676 --- /dev/null +++ b/internal/services/managedidentity/user_assigned_identity_resource_list.go @@ -0,0 +1,123 @@ +// Copyright IBM Corp. 2014, 2026 +// SPDX-License-Identifier: MPL-2.0 + +package managedidentity + +import ( + "context" + "fmt" + + "github.com/hashicorp/go-azure-helpers/lang/pointer" + "github.com/hashicorp/go-azure-helpers/resourcemanager/commonids" + "github.com/hashicorp/terraform-plugin-framework/list" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-provider-azurerm/internal/sdk" + "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" +) + +type UserAssignedIdentityListResource struct{} + +var _ sdk.FrameworkListWrappedResource = new(UserAssignedIdentityListResource) + +func (UserAssignedIdentityListResource) Metadata(_ context.Context, _ resource.MetadataRequest, response *resource.MetadataResponse) { + response.TypeName = UserAssignedIdentityResource{}.ResourceType() +} + +func (UserAssignedIdentityListResource) ResourceFunc() *pluginsdk.Resource { + return sdk.WrappedResource(UserAssignedIdentityResource{}) +} + +func (UserAssignedIdentityListResource) List(ctx context.Context, request list.ListRequest, stream *list.ListResultsStream, metadata sdk.ResourceMetadata) { + client := metadata.Client.ManagedIdentity.V20241130.Identities + + var data sdk.DefaultListModel + diags := request.Config.Get(ctx, &data) + if diags.HasError() { + stream.Results = list.ListResultsStreamDiagnostics(diags) + return + } + + subscriptionID := metadata.SubscriptionId + if !data.SubscriptionId.IsNull() { + subscriptionID = data.SubscriptionId.ValueString() + } + + r := UserAssignedIdentityResource{} + + switch { + case !data.ResourceGroupName.IsNull(): + resp, err := client.UserAssignedIdentitiesListByResourceGroupComplete(ctx, commonids.NewResourceGroupID(subscriptionID, data.ResourceGroupName.ValueString())) + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", r.ResourceType()), err) + return + } + + stream.Results = func(push func(list.ListResult) bool) { + for _, item := range resp.Items { + result := request.NewListResult(ctx) + result.DisplayName = pointer.From(item.Name) + + id, err := commonids.ParseUserAssignedIdentityIDInsensitively(pointer.From(item.Id)) + if err != nil { + sdk.SetErrorDiagnosticAndPushListResult(result, push, "parsing User Assigned Identity ID", err) + return + } + + meta := sdk.NewResourceMetaData(metadata.Client, r) + meta.SetID(id) + + if err := r.flatten(meta, id, &item); err != nil { + sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", r.ResourceType()), err) + return + } + + sdk.EncodeListResult(ctx, meta.ResourceData, &result) + if result.Diagnostics.HasError() { + push(result) + return + } + + if !push(result) { + return + } + } + } + default: + resp, err := client.UserAssignedIdentitiesListBySubscriptionComplete(ctx, commonids.NewSubscriptionID(subscriptionID)) + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", r.ResourceType()), err) + return + } + + stream.Results = func(push func(list.ListResult) bool) { + for _, item := range resp.Items { + result := request.NewListResult(ctx) + result.DisplayName = pointer.From(item.Name) + + id, err := commonids.ParseUserAssignedIdentityIDInsensitively(pointer.From(item.Id)) + if err != nil { + sdk.SetErrorDiagnosticAndPushListResult(result, push, "parsing User Assigned Identity ID", err) + return + } + + meta := sdk.NewResourceMetaData(metadata.Client, r) + meta.SetID(id) + + if err := r.flatten(meta, id, &item); err != nil { + sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", r.ResourceType()), err) + return + } + + sdk.EncodeListResult(ctx, meta.ResourceData, &result) + if result.Diagnostics.HasError() { + push(result) + return + } + + if !push(result) { + return + } + } + } + } +} diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go new file mode 100644 index 000000000000..01d6cea9acbe --- /dev/null +++ b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go @@ -0,0 +1,100 @@ +// Copyright IBM Corp. 2014, 2026 +// SPDX-License-Identifier: MPL-2.0 + +package managedidentity_test + +import ( + "context" + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/knownvalue" + "github.com/hashicorp/terraform-plugin-testing/querycheck" + "github.com/hashicorp/terraform-plugin-testing/tfversion" + "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance" + "github.com/hashicorp/terraform-provider-azurerm/internal/provider/framework" +) + +func TestAccUserAssignedIdentity_list(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test") + r := UserAssignedIdentityTestResource{} + resourceName := fmt.Sprintf("acctestuai-0-%d", data.RandomInteger) + resourceGroupName := fmt.Sprintf("acctestrg-%d", data.RandomInteger) + + resource.Test(t, resource.TestCase{ + TerraformVersionChecks: []tfversion.TerraformVersionCheck{ + tfversion.SkipBelow(tfversion.Version1_14_0), + }, + ProtoV5ProviderFactories: framework.ProtoV5ProviderFactoriesInit(context.Background(), "azurerm"), + Steps: []resource.TestStep{ + { + Config: r.basicList(data), + }, + { + Query: true, + Config: r.subscriptionListQuery(), + QueryResultChecks: []querycheck.QueryResultCheck{ + querycheck.ExpectLengthAtLeast("azurerm_user_assigned_identity.list", 3), + querycheck.ExpectIdentity("azurerm_user_assigned_identity.list", map[string]knownvalue.Check{ + "name": knownvalue.StringExact(resourceName), + "resource_group_name": knownvalue.StringExact(resourceGroupName), + "subscription_id": knownvalue.StringExact(data.Subscriptions.Primary), + }), + }, + }, + { + Query: true, + Config: r.resourceGroupListQuery(data), + QueryResultChecks: []querycheck.QueryResultCheck{ + querycheck.ExpectLength("azurerm_user_assigned_identity.list", 3), + querycheck.ExpectIdentity("azurerm_user_assigned_identity.list", map[string]knownvalue.Check{ + "name": knownvalue.StringExact(resourceName), + "resource_group_name": knownvalue.StringExact(resourceGroupName), + "subscription_id": knownvalue.StringExact(data.Subscriptions.Primary), + }), + }, + }, + }, + }) +} + +func (UserAssignedIdentityTestResource) basicList(data acceptance.TestData) string { + return fmt.Sprintf(` +provider "azurerm" { + features {} +} + +resource "azurerm_resource_group" "test" { + name = "acctestrg-%[1]d" + location = "%[2]s" +} + +resource "azurerm_user_assigned_identity" "test" { + count = 3 + + name = "acctestuai-${count.index}-%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name +} +`, data.RandomInteger, data.Locations.Primary) +} + +func (UserAssignedIdentityTestResource) subscriptionListQuery() string { + return ` +list "azurerm_user_assigned_identity" "list" { + provider = azurerm +} +` +} + +func (UserAssignedIdentityTestResource) resourceGroupListQuery(data acceptance.TestData) string { + return fmt.Sprintf(` +list "azurerm_user_assigned_identity" "list" { + provider = azurerm + config { + resource_group_name = "acctestrg-%[1]d" + } +} +`, data.RandomInteger) +} diff --git a/website/docs/list-resources/user_assigned_identity.html.markdown b/website/docs/list-resources/user_assigned_identity.html.markdown new file mode 100644 index 000000000000..a2c9e9c3224c --- /dev/null +++ b/website/docs/list-resources/user_assigned_identity.html.markdown @@ -0,0 +1,40 @@ +--- +subcategory: "Authorization" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_user_assigned_identity" +description: |- + Lists User Assigned Identity resources. +--- + +# List resource: azurerm_user_assigned_identity + +Lists User Assigned Identity resources. + +## Example Usage + +### List all User Assigned Identities in the subscription + +```hcl +list "azurerm_user_assigned_identity" "example" { + provider = azurerm +} +``` + +### List all User Assigned Identities in a Resource Group + +```hcl +list "azurerm_user_assigned_identity" "example" { + provider = azurerm + config { + resource_group_name = "example-rg" + } +} +``` + +## Argument Reference + +This list resource supports the following arguments: + +* `subscription_id` - (Optional) The ID of the Subscription to query. Defaults to the value specified in the Provider Configuration. + +* `resource_group_name` - (Optional) The name of the Resource Group to query. From e60bd62bcaf0b79672ba6268e2acf7638e49e0e4 Mon Sep 17 00:00:00 2001 From: aayushsingh2502 Date: Mon, 22 Jun 2026 18:10:03 +0530 Subject: [PATCH 2/7] wait timer added --- .../user_assigned_identity_resource_list_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go index 01d6cea9acbe..a94e8f27d9d5 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go +++ b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "testing" + "time" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/knownvalue" @@ -32,8 +33,9 @@ func TestAccUserAssignedIdentity_list(t *testing.T) { Config: r.basicList(data), }, { - Query: true, - Config: r.subscriptionListQuery(), + PreConfig: func() { time.Sleep(2 * time.Minute) }, + Query: true, + Config: r.subscriptionListQuery(), QueryResultChecks: []querycheck.QueryResultCheck{ querycheck.ExpectLengthAtLeast("azurerm_user_assigned_identity.list", 3), querycheck.ExpectIdentity("azurerm_user_assigned_identity.list", map[string]knownvalue.Check{ From 376e10f6c2ef7ef8dca20cd16256100ebab8379f Mon Sep 17 00:00:00 2001 From: aayushsingh2502 Date: Tue, 23 Jun 2026 12:10:02 +0530 Subject: [PATCH 3/7] review fixes --- .../managedidentity/user_assigned_identity_resource_list.go | 4 ++-- .../user_assigned_identity_resource_list_test.go | 1 + .../docs/list-resources/user_assigned_identity.html.markdown | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list.go b/internal/services/managedidentity/user_assigned_identity_resource_list.go index 2f6be8f23676..302860fd41a4 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource_list.go +++ b/internal/services/managedidentity/user_assigned_identity_resource_list.go @@ -67,7 +67,7 @@ func (UserAssignedIdentityListResource) List(ctx context.Context, request list.L meta.SetID(id) if err := r.flatten(meta, id, &item); err != nil { - sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", r.ResourceType()), err) + sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", pointer.From(item.Name)), err) return } @@ -104,7 +104,7 @@ func (UserAssignedIdentityListResource) List(ctx context.Context, request list.L meta.SetID(id) if err := r.flatten(meta, id, &item); err != nil { - sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", r.ResourceType()), err) + sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", pointer.From(item.Name)), err) return } diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go index a94e8f27d9d5..1521bbbb8d43 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go +++ b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go @@ -33,6 +33,7 @@ func TestAccUserAssignedIdentity_list(t *testing.T) { Config: r.basicList(data), }, { + // Wait for the subscription-level User Assigned Identity listing API to become eventually consistent after resource creation. PreConfig: func() { time.Sleep(2 * time.Minute) }, Query: true, Config: r.subscriptionListQuery(), diff --git a/website/docs/list-resources/user_assigned_identity.html.markdown b/website/docs/list-resources/user_assigned_identity.html.markdown index a2c9e9c3224c..6e52caecec79 100644 --- a/website/docs/list-resources/user_assigned_identity.html.markdown +++ b/website/docs/list-resources/user_assigned_identity.html.markdown @@ -17,6 +17,7 @@ Lists User Assigned Identity resources. ```hcl list "azurerm_user_assigned_identity" "example" { provider = azurerm + config {} } ``` From 04cf102bc5f31fae549f43a86e6d5140f8bf54e3 Mon Sep 17 00:00:00 2001 From: aayushsingh2502 Date: Tue, 23 Jun 2026 15:30:33 +0530 Subject: [PATCH 4/7] identity test added --- ...ned_identity_resource_identity_gen_test.go | 39 +++++++++++++++++++ ...er_assigned_identity_resource_list_test.go | 8 ++-- .../user_assigned_identity_resource_test.go | 20 +++++----- 3 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 internal/services/managedidentity/user_assigned_identity_resource_identity_gen_test.go diff --git a/internal/services/managedidentity/user_assigned_identity_resource_identity_gen_test.go b/internal/services/managedidentity/user_assigned_identity_resource_identity_gen_test.go new file mode 100644 index 000000000000..91d7b7b91bee --- /dev/null +++ b/internal/services/managedidentity/user_assigned_identity_resource_identity_gen_test.go @@ -0,0 +1,39 @@ +// Copyright IBM Corp. 2014, 2025 +// SPDX-License-Identifier: MPL-2.0 + +package managedidentity_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-testing/knownvalue" + "github.com/hashicorp/terraform-plugin-testing/statecheck" + "github.com/hashicorp/terraform-plugin-testing/tfjsonpath" + "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance" + customstatecheck "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/statecheck" +) + +func TestAccUserAssignedIdentity_resourceIdentity(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test") + r := UserAssignedIdentityResource{} + + checkedFields := map[string]struct{}{ + "subscription_id": {}, + "name": {}, + "resource_group_name": {}, + } + + data.ResourceIdentityTest(t, []acceptance.TestStep{ + { + Config: r.basic(data), + ConfigStateChecks: []statecheck.StateCheck{ + customstatecheck.ExpectAllIdentityFieldsAreChecked("azurerm_user_assigned_identity.test", checkedFields), + statecheck.ExpectIdentityValue("azurerm_user_assigned_identity.test", tfjsonpath.New("subscription_id"), knownvalue.StringExact(data.Subscriptions.Primary)), + statecheck.ExpectIdentityValueMatchesStateAtPath("azurerm_user_assigned_identity.test", tfjsonpath.New("name"), tfjsonpath.New("name")), + statecheck.ExpectIdentityValueMatchesStateAtPath("azurerm_user_assigned_identity.test", tfjsonpath.New("resource_group_name"), tfjsonpath.New("resource_group_name")), + }, + }, + data.ImportBlockWithResourceIdentityStep(false), + data.ImportBlockWithIDStep(false), + }, false) +} diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go index 1521bbbb8d43..a3229ab18d6f 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go +++ b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go @@ -19,7 +19,7 @@ import ( func TestAccUserAssignedIdentity_list(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test") - r := UserAssignedIdentityTestResource{} + r := UserAssignedIdentityResource{} resourceName := fmt.Sprintf("acctestuai-0-%d", data.RandomInteger) resourceGroupName := fmt.Sprintf("acctestrg-%d", data.RandomInteger) @@ -62,7 +62,7 @@ func TestAccUserAssignedIdentity_list(t *testing.T) { }) } -func (UserAssignedIdentityTestResource) basicList(data acceptance.TestData) string { +func (UserAssignedIdentityResource) basicList(data acceptance.TestData) string { return fmt.Sprintf(` provider "azurerm" { features {} @@ -83,7 +83,7 @@ resource "azurerm_user_assigned_identity" "test" { `, data.RandomInteger, data.Locations.Primary) } -func (UserAssignedIdentityTestResource) subscriptionListQuery() string { +func (UserAssignedIdentityResource) subscriptionListQuery() string { return ` list "azurerm_user_assigned_identity" "list" { provider = azurerm @@ -91,7 +91,7 @@ list "azurerm_user_assigned_identity" "list" { ` } -func (UserAssignedIdentityTestResource) resourceGroupListQuery(data acceptance.TestData) string { +func (UserAssignedIdentityResource) resourceGroupListQuery(data acceptance.TestData) string { return fmt.Sprintf(` list "azurerm_user_assigned_identity" "list" { provider = azurerm diff --git a/internal/services/managedidentity/user_assigned_identity_resource_test.go b/internal/services/managedidentity/user_assigned_identity_resource_test.go index f04b29a5213c..048721435920 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource_test.go +++ b/internal/services/managedidentity/user_assigned_identity_resource_test.go @@ -16,11 +16,11 @@ import ( "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" ) -type UserAssignedIdentityTestResource struct{} +type UserAssignedIdentityResource struct{} func TestAccUserAssignedIdentity_basic(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test") - r := UserAssignedIdentityTestResource{} + r := UserAssignedIdentityResource{} data.ResourceTest(t, r, []acceptance.TestStep{ { @@ -35,7 +35,7 @@ func TestAccUserAssignedIdentity_basic(t *testing.T) { func TestAccUserAssignedIdentity_requiresImport(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test") - r := UserAssignedIdentityTestResource{} + r := UserAssignedIdentityResource{} data.ResourceTest(t, r, []acceptance.TestStep{ { @@ -50,7 +50,7 @@ func TestAccUserAssignedIdentity_requiresImport(t *testing.T) { func TestAccUserAssignedIdentity_complete(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test") - r := UserAssignedIdentityTestResource{} + r := UserAssignedIdentityResource{} data.ResourceTest(t, r, []acceptance.TestStep{ { @@ -65,7 +65,7 @@ func TestAccUserAssignedIdentity_complete(t *testing.T) { func TestAccUserAssignedIdentity_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test") - r := UserAssignedIdentityTestResource{} + r := UserAssignedIdentityResource{} data.ResourceTest(t, r, []acceptance.TestStep{ { @@ -92,7 +92,7 @@ func TestAccUserAssignedIdentity_update(t *testing.T) { }) } -func (r UserAssignedIdentityTestResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { +func (r UserAssignedIdentityResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { id, err := commonids.ParseUserAssignedIdentityID(state.ID) if err != nil { return nil, err @@ -106,7 +106,7 @@ func (r UserAssignedIdentityTestResource) Exists(ctx context.Context, clients *c return pointer.To(resp.Model != nil), nil } -func (r UserAssignedIdentityTestResource) basic(data acceptance.TestData) string { +func (r UserAssignedIdentityResource) basic(data acceptance.TestData) string { return fmt.Sprintf(` %s @@ -122,7 +122,7 @@ resource "azurerm_user_assigned_identity" "test" { `, r.template(data)) } -func (r UserAssignedIdentityTestResource) requiresImport(data acceptance.TestData) string { +func (r UserAssignedIdentityResource) requiresImport(data acceptance.TestData) string { return fmt.Sprintf(` %s @@ -134,7 +134,7 @@ resource "azurerm_user_assigned_identity" "import" { `, r.basic(data)) } -func (r UserAssignedIdentityTestResource) complete(data acceptance.TestData) string { +func (r UserAssignedIdentityResource) complete(data acceptance.TestData) string { return fmt.Sprintf(` %s @@ -156,7 +156,7 @@ resource "azurerm_user_assigned_identity" "test" { `, r.template(data)) } -func (r UserAssignedIdentityTestResource) template(data acceptance.TestData) string { +func (r UserAssignedIdentityResource) template(data acceptance.TestData) string { return fmt.Sprintf(` variable "primary_location" { default = %q From fd76b232851b67e6f0189fa04dfe34307d57dc07 Mon Sep 17 00:00:00 2001 From: aayushsingh2502 Date: Tue, 23 Jun 2026 18:45:42 +0530 Subject: [PATCH 5/7] removed expect identity --- .../user_assigned_identity_resource_list_test.go | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go index a3229ab18d6f..87a82ee88d18 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource_list_test.go +++ b/internal/services/managedidentity/user_assigned_identity_resource_list_test.go @@ -7,7 +7,6 @@ import ( "context" "fmt" "testing" - "time" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/knownvalue" @@ -33,17 +32,13 @@ func TestAccUserAssignedIdentity_list(t *testing.T) { Config: r.basicList(data), }, { - // Wait for the subscription-level User Assigned Identity listing API to become eventually consistent after resource creation. - PreConfig: func() { time.Sleep(2 * time.Minute) }, - Query: true, - Config: r.subscriptionListQuery(), + // ExpectIdentity is intentionally omitted here: the subscription-wide list API has eventual consistency on large subscriptions + // (e.g. TeamCity), where newly-created resources may not appear for several minutes. Identity is validated in the + // resource-group-scoped step below, which is fully deterministic. + Query: true, + Config: r.subscriptionListQuery(), QueryResultChecks: []querycheck.QueryResultCheck{ querycheck.ExpectLengthAtLeast("azurerm_user_assigned_identity.list", 3), - querycheck.ExpectIdentity("azurerm_user_assigned_identity.list", map[string]knownvalue.Check{ - "name": knownvalue.StringExact(resourceName), - "resource_group_name": knownvalue.StringExact(resourceGroupName), - "subscription_id": knownvalue.StringExact(data.Subscriptions.Primary), - }), }, }, { From 74964789926069011a98718c961a04c5e6ca4a4f Mon Sep 17 00:00:00 2001 From: aayushsingh2502 Date: Tue, 7 Jul 2026 15:34:43 +0530 Subject: [PATCH 6/7] resource name update --- .../managedidentity/user_assigned_identity_resource_list.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/services/managedidentity/user_assigned_identity_resource_list.go b/internal/services/managedidentity/user_assigned_identity_resource_list.go index 302860fd41a4..2f6be8f23676 100644 --- a/internal/services/managedidentity/user_assigned_identity_resource_list.go +++ b/internal/services/managedidentity/user_assigned_identity_resource_list.go @@ -67,7 +67,7 @@ func (UserAssignedIdentityListResource) List(ctx context.Context, request list.L meta.SetID(id) if err := r.flatten(meta, id, &item); err != nil { - sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", pointer.From(item.Name)), err) + sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", r.ResourceType()), err) return } @@ -104,7 +104,7 @@ func (UserAssignedIdentityListResource) List(ctx context.Context, request list.L meta.SetID(id) if err := r.flatten(meta, id, &item); err != nil { - sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", pointer.From(item.Name)), err) + sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", r.ResourceType()), err) return } From 54996420985613a1d2a30f03ebd8500dfbb129a1 Mon Sep 17 00:00:00 2001 From: aayushsingh2502 Date: Fri, 10 Jul 2026 12:30:02 +0530 Subject: [PATCH 7/7] indentation fix --- internal/services/managedidentity/registration.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/services/managedidentity/registration.go b/internal/services/managedidentity/registration.go index d7dd1ab5620a..89ba216cd05b 100644 --- a/internal/services/managedidentity/registration.go +++ b/internal/services/managedidentity/registration.go @@ -77,7 +77,7 @@ func (r Registration) EphemeralResources() []func() ephemeral.EphemeralResource func (r Registration) ListResources() []sdk.FrameworkListWrappedResource { return []sdk.FrameworkListWrappedResource{ - FederatedIdentityCredentialListResource{}, - UserAssignedIdentityListResource{}, + FederatedIdentityCredentialListResource{}, + UserAssignedIdentityListResource{}, } }