From 4481c0e93b77860934613278347cac7dd0ccbba0 Mon Sep 17 00:00:00 2001 From: sreallymatt <106555974+sreallymatt@users.noreply.github.com> Date: Mon, 3 Nov 2025 14:38:22 -0700 Subject: [PATCH 1/3] New List Resource: `azurerm_network_security_group` # Conflicts: # internal/services/network/registration.go --- .../network_security_group_list_resource.go | 160 ++++++++++++++++++ ...twork_security_group_list_resource_test.go | 78 +++++++++ .../network_security_group_resource.go | 16 +- .../network_security_group_resource_test.go | 2 +- .../network_security_group.html.markdown | 43 +++++ 5 files changed, 294 insertions(+), 5 deletions(-) create mode 100644 internal/services/network/network_security_group_list_resource.go create mode 100644 internal/services/network/network_security_group_list_resource_test.go create mode 100644 website/docs/list-resources/network_security_group.html.markdown diff --git a/internal/services/network/network_security_group_list_resource.go b/internal/services/network/network_security_group_list_resource.go new file mode 100644 index 000000000000..64d42121b321 --- /dev/null +++ b/internal/services/network/network_security_group_list_resource.go @@ -0,0 +1,160 @@ +package network + +import ( + "context" + "fmt" + "time" + + "github.com/hashicorp/go-azure-helpers/framework/typehelpers" + "github.com/hashicorp/go-azure-helpers/lang/pointer" + "github.com/hashicorp/go-azure-helpers/resourcemanager/commonids" + "github.com/hashicorp/go-azure-helpers/resourcemanager/resourcegroups" + "github.com/hashicorp/go-azure-sdk/resource-manager/network/2025-01-01/networksecuritygroups" + "github.com/hashicorp/terraform-plugin-framework/list" + "github.com/hashicorp/terraform-plugin-framework/list/schema" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/hashicorp/terraform-provider-azurerm/internal/sdk" + "github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation" +) + +type NetworkSecurityGroupListResource struct { + sdk.ListResourceMetadata +} + +type NetworkSecurityGroupListModel struct { + ResourceGroupName types.String `tfsdk:"resource_group_name"` + SubscriptionId types.String `tfsdk:"subscription_id"` +} + +var _ sdk.ListResourceWithRawV5Schemas = new(NetworkSecurityGroupListResource) + +func NewNetworkSecurityGroupListResource() list.ListResource { + return new(NetworkSecurityGroupListResource) +} + +func (r *NetworkSecurityGroupListResource) Metadata(_ context.Context, _ resource.MetadataRequest, response *resource.MetadataResponse) { + response.TypeName = networkSecurityGroupResourceName +} + +func (r *NetworkSecurityGroupListResource) ListResourceConfigSchema(_ context.Context, _ list.ListResourceSchemaRequest, response *list.ListResourceSchemaResponse) { + response.Schema = schema.Schema{ + Attributes: map[string]schema.Attribute{ + "resource_group_name": schema.StringAttribute{ + Optional: true, + Validators: []validator.String{ + typehelpers.WrappedStringValidator{ + Func: resourcegroups.ValidateName, + }, + }, + }, + "subscription_id": schema.StringAttribute{ + Optional: true, + Validators: []validator.String{ + typehelpers.WrappedStringValidator{ + Func: validation.IsUUID, + }, + }, + }, + }, + } +} + +func (r *NetworkSecurityGroupListResource) List(ctx context.Context, request list.ListRequest, stream *list.ListResultsStream) { + client := r.Client.Network.NetworkSecurityGroups + + ctx, cancel := context.WithTimeout(ctx, time.Minute*60) + defer cancel() + + var data NetworkSecurityGroupListModel + diags := request.Config.Get(ctx, &data) + if diags.HasError() { + stream.Results = list.ListResultsStreamDiagnostics(diags) + return + } + + results := make([]networksecuritygroups.NetworkSecurityGroup, 0) + + subscriptionID := r.SubscriptionId + if !data.SubscriptionId.IsNull() { + subscriptionID = data.SubscriptionId.ValueString() + } + + switch { + case !data.ResourceGroupName.IsNull(): + resp, err := client.ListComplete(ctx, commonids.NewResourceGroupID(subscriptionID, data.ResourceGroupName.ValueString())) + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", networkSecurityGroupResourceName), err) + return + } + + results = resp.Items + default: + resp, err := client.ListAllComplete(ctx, commonids.NewSubscriptionID(subscriptionID)) + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", networkSecurityGroupResourceName), err) + return + } + + results = resp.Items + } + + stream.Results = func(push func(list.ListResult) bool) { + for _, nsg := range results { + result := request.NewListResult(ctx) + result.DisplayName = pointer.From(nsg.Name) + + id, err := networksecuritygroups.ParseNetworkSecurityGroupID(pointer.From(nsg.Id)) + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, "parsing Network Security Group ID", err) + return + } + + rd := resourceNetworkSecurityGroup().Data(&terraform.InstanceState{}) + rd.SetId(id.ID()) + + if err := resourceNetworkSecurityGroupFlatten(rd, id, &nsg); err != nil { + sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("encoding `%s` resource data", networkSecurityGroupResourceName), err) + return + } + + tfTypeIdentity, err := rd.TfTypeIdentityState() + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, "converting Identity State", err) + return + } + + if err := result.Identity.Set(ctx, *tfTypeIdentity); err != nil { + sdk.SetResponseErrorDiagnostic(stream, "setting Identity Data", err) + return + } + + tfTypeResourceState, err := rd.TfTypeResourceState() + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, "converting Resource State", err) + return + } + + if err := result.Resource.Set(ctx, *tfTypeResourceState); err != nil { + sdk.SetResponseErrorDiagnostic(stream, "setting Resource Data", err) + return + } + + if !push(result) { + return + } + } + } +} + +func (r *NetworkSecurityGroupListResource) Configure(_ context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) { + r.Defaults(request, response) +} + +func (r *NetworkSecurityGroupListResource) RawV5Schemas(ctx context.Context, _ list.RawV5SchemaRequest, response *list.RawV5SchemaResponse) { + res := resourceNetworkSecurityGroup() + response.ProtoV5Schema = res.ProtoSchema(ctx)() + response.ProtoV5IdentitySchema = res.ProtoIdentitySchema(ctx)() +} diff --git a/internal/services/network/network_security_group_list_resource_test.go b/internal/services/network/network_security_group_list_resource_test.go new file mode 100644 index 000000000000..95248246358f --- /dev/null +++ b/internal/services/network/network_security_group_list_resource_test.go @@ -0,0 +1,78 @@ +package network_test + +import ( + "context" + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "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 TestAccNetworkSecurityGroup_list_basic(t *testing.T) { + r := NetworkSecurityGroupResource{} + + data := acceptance.BuildTestData(t, "azurerm_network_security_group", "test1") + + 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.basicListQuery(data), + ConfigQueryChecks: []querycheck.QueryCheck{}, // TODO + }, + }, + }) +} + +func (r NetworkSecurityGroupResource) 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_network_security_group" "test1" { + name = "acctestNSG1-%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name +} + +resource "azurerm_network_security_group" "tes2" { + name = "acctestNSG2-%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name +} + +resource "azurerm_network_security_group" "test3" { + name = "acctestNSG3-%[1]d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name +} +`, data.RandomInteger, data.Locations.Primary) +} + +func (r NetworkSecurityGroupResource) basicListQuery(data acceptance.TestData) string { + return fmt.Sprintf(` +list "azurerm_network_security_group" "list" { + provider = azurerm + config { + resource_group_name = "acctestRG-%[1]d" + } +} +`, data.RandomInteger) +} diff --git a/internal/services/network/network_security_group_resource.go b/internal/services/network/network_security_group_resource.go index 447c80a01bbd..3b9921b9a363 100644 --- a/internal/services/network/network_security_group_resource.go +++ b/internal/services/network/network_security_group_resource.go @@ -300,18 +300,26 @@ func resourceNetworkSecurityGroupRead(d *pluginsdk.ResourceData, meta interface{ return fmt.Errorf("retrieving %s: %+v", id, err) } + if err := resourceNetworkSecurityGroupFlatten(d, id, resp.Model); err != nil { + return fmt.Errorf("flattening %s: %+v", id, err) + } + + return nil +} + +func resourceNetworkSecurityGroupFlatten(d *pluginsdk.ResourceData, id *networksecuritygroups.NetworkSecurityGroupId, nsg *networksecuritygroups.NetworkSecurityGroup) error { d.Set("name", id.NetworkSecurityGroupName) d.Set("resource_group_name", id.ResourceGroupName) - if model := resp.Model; model != nil { - d.Set("location", location.NormalizeNilable(model.Location)) - if props := model.Properties; props != nil { + if nsg != nil { + d.Set("location", location.NormalizeNilable(nsg.Location)) + if props := nsg.Properties; props != nil { flattenedRules := flattenNetworkSecurityRules(props.SecurityRules) if err := d.Set("security_rule", flattenedRules); err != nil { return fmt.Errorf("setting `security_rule`: %+v", err) } } - if err := tags.FlattenAndSet(d, model.Tags); err != nil { + if err := tags.FlattenAndSet(d, nsg.Tags); err != nil { return err } } diff --git a/internal/services/network/network_security_group_resource_test.go b/internal/services/network/network_security_group_resource_test.go index dba9fe15b31d..eed9dc85949e 100644 --- a/internal/services/network/network_security_group_resource_test.go +++ b/internal/services/network/network_security_group_resource_test.go @@ -192,7 +192,7 @@ func TestAccNetworkSecurityGroup_applicationSecurityGroup(t *testing.T) { }) } -func (t NetworkSecurityGroupResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { +func (r NetworkSecurityGroupResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) { id, err := networksecuritygroups.ParseNetworkSecurityGroupID(state.ID) if err != nil { return nil, err diff --git a/website/docs/list-resources/network_security_group.html.markdown b/website/docs/list-resources/network_security_group.html.markdown new file mode 100644 index 000000000000..8beec75a755f --- /dev/null +++ b/website/docs/list-resources/network_security_group.html.markdown @@ -0,0 +1,43 @@ +--- +subcategory: "Network" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_network_security_group" +description: |- + Lists Network Security Group resources. +--- + +# List resource: azurerm_network_security_group + +~> **Note:** The `azurerm_network_security_group` List Resource is in beta. Its interface and behaviour may change as the feature evolves, and breaking changes are possible. It is offered as a technical preview without compatibility guarantees until Terraform 1.14 is generally available. + +Lists Network Security Group resources. + +## Example Usage + +### List all Network Security Groups in the subscription + +```hcl +list "azurerm_network_security_group" "example" { + provider = azurerm + config {} +} +``` + +### List all Network Security Groups in a specific resource group + +```hcl +list "azurerm_network_security_group" "example" { + provider = azurerm + config { + resource_group_name = "example-rg" + } +} +``` + +## Argument Reference + +This list resource supports the following arguments: + +* `resource_group_name` - (Optional) The name of the resource group to query. + +* `subscription_id` - (Optional) The Subscription ID to query. Defaults to the value specified in the Provider Configuration. From 8331a577aefa517978bf390e0aa84d846639606f Mon Sep 17 00:00:00 2001 From: sreallymatt <106555974+sreallymatt@users.noreply.github.com> Date: Mon, 3 Nov 2025 15:07:19 -0700 Subject: [PATCH 2/3] fix typo --- .../network/network_security_group_list_resource_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/services/network/network_security_group_list_resource_test.go b/internal/services/network/network_security_group_list_resource_test.go index 95248246358f..a65d82eebcc3 100644 --- a/internal/services/network/network_security_group_list_resource_test.go +++ b/internal/services/network/network_security_group_list_resource_test.go @@ -52,7 +52,7 @@ resource "azurerm_network_security_group" "test1" { resource_group_name = azurerm_resource_group.test.name } -resource "azurerm_network_security_group" "tes2" { +resource "azurerm_network_security_group" "test2" { name = "acctestNSG2-%[1]d" location = azurerm_resource_group.test.location resource_group_name = azurerm_resource_group.test.name From d41e96fb624fe8664febd0d2094734ebce154b97 Mon Sep 17 00:00:00 2001 From: sreallymatt <106555974+sreallymatt@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:53:43 -0700 Subject: [PATCH 3/3] New List Resource: # Conflicts: # internal/services/network/registration.go --- .../network_security_group_list_resource.go | 160 ------------------ .../network_security_group_resource_list.go | 115 +++++++++++++ ...work_security_group_resource_list_test.go} | 18 +- internal/services/network/registration.go | 1 + 4 files changed, 132 insertions(+), 162 deletions(-) delete mode 100644 internal/services/network/network_security_group_list_resource.go create mode 100644 internal/services/network/network_security_group_resource_list.go rename internal/services/network/{network_security_group_list_resource_test.go => network_security_group_resource_list_test.go} (82%) diff --git a/internal/services/network/network_security_group_list_resource.go b/internal/services/network/network_security_group_list_resource.go deleted file mode 100644 index 64d42121b321..000000000000 --- a/internal/services/network/network_security_group_list_resource.go +++ /dev/null @@ -1,160 +0,0 @@ -package network - -import ( - "context" - "fmt" - "time" - - "github.com/hashicorp/go-azure-helpers/framework/typehelpers" - "github.com/hashicorp/go-azure-helpers/lang/pointer" - "github.com/hashicorp/go-azure-helpers/resourcemanager/commonids" - "github.com/hashicorp/go-azure-helpers/resourcemanager/resourcegroups" - "github.com/hashicorp/go-azure-sdk/resource-manager/network/2025-01-01/networksecuritygroups" - "github.com/hashicorp/terraform-plugin-framework/list" - "github.com/hashicorp/terraform-plugin-framework/list/schema" - "github.com/hashicorp/terraform-plugin-framework/resource" - "github.com/hashicorp/terraform-plugin-framework/schema/validator" - "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" - "github.com/hashicorp/terraform-provider-azurerm/internal/sdk" - "github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation" -) - -type NetworkSecurityGroupListResource struct { - sdk.ListResourceMetadata -} - -type NetworkSecurityGroupListModel struct { - ResourceGroupName types.String `tfsdk:"resource_group_name"` - SubscriptionId types.String `tfsdk:"subscription_id"` -} - -var _ sdk.ListResourceWithRawV5Schemas = new(NetworkSecurityGroupListResource) - -func NewNetworkSecurityGroupListResource() list.ListResource { - return new(NetworkSecurityGroupListResource) -} - -func (r *NetworkSecurityGroupListResource) Metadata(_ context.Context, _ resource.MetadataRequest, response *resource.MetadataResponse) { - response.TypeName = networkSecurityGroupResourceName -} - -func (r *NetworkSecurityGroupListResource) ListResourceConfigSchema(_ context.Context, _ list.ListResourceSchemaRequest, response *list.ListResourceSchemaResponse) { - response.Schema = schema.Schema{ - Attributes: map[string]schema.Attribute{ - "resource_group_name": schema.StringAttribute{ - Optional: true, - Validators: []validator.String{ - typehelpers.WrappedStringValidator{ - Func: resourcegroups.ValidateName, - }, - }, - }, - "subscription_id": schema.StringAttribute{ - Optional: true, - Validators: []validator.String{ - typehelpers.WrappedStringValidator{ - Func: validation.IsUUID, - }, - }, - }, - }, - } -} - -func (r *NetworkSecurityGroupListResource) List(ctx context.Context, request list.ListRequest, stream *list.ListResultsStream) { - client := r.Client.Network.NetworkSecurityGroups - - ctx, cancel := context.WithTimeout(ctx, time.Minute*60) - defer cancel() - - var data NetworkSecurityGroupListModel - diags := request.Config.Get(ctx, &data) - if diags.HasError() { - stream.Results = list.ListResultsStreamDiagnostics(diags) - return - } - - results := make([]networksecuritygroups.NetworkSecurityGroup, 0) - - subscriptionID := r.SubscriptionId - if !data.SubscriptionId.IsNull() { - subscriptionID = data.SubscriptionId.ValueString() - } - - switch { - case !data.ResourceGroupName.IsNull(): - resp, err := client.ListComplete(ctx, commonids.NewResourceGroupID(subscriptionID, data.ResourceGroupName.ValueString())) - if err != nil { - sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", networkSecurityGroupResourceName), err) - return - } - - results = resp.Items - default: - resp, err := client.ListAllComplete(ctx, commonids.NewSubscriptionID(subscriptionID)) - if err != nil { - sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", networkSecurityGroupResourceName), err) - return - } - - results = resp.Items - } - - stream.Results = func(push func(list.ListResult) bool) { - for _, nsg := range results { - result := request.NewListResult(ctx) - result.DisplayName = pointer.From(nsg.Name) - - id, err := networksecuritygroups.ParseNetworkSecurityGroupID(pointer.From(nsg.Id)) - if err != nil { - sdk.SetResponseErrorDiagnostic(stream, "parsing Network Security Group ID", err) - return - } - - rd := resourceNetworkSecurityGroup().Data(&terraform.InstanceState{}) - rd.SetId(id.ID()) - - if err := resourceNetworkSecurityGroupFlatten(rd, id, &nsg); err != nil { - sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("encoding `%s` resource data", networkSecurityGroupResourceName), err) - return - } - - tfTypeIdentity, err := rd.TfTypeIdentityState() - if err != nil { - sdk.SetResponseErrorDiagnostic(stream, "converting Identity State", err) - return - } - - if err := result.Identity.Set(ctx, *tfTypeIdentity); err != nil { - sdk.SetResponseErrorDiagnostic(stream, "setting Identity Data", err) - return - } - - tfTypeResourceState, err := rd.TfTypeResourceState() - if err != nil { - sdk.SetResponseErrorDiagnostic(stream, "converting Resource State", err) - return - } - - if err := result.Resource.Set(ctx, *tfTypeResourceState); err != nil { - sdk.SetResponseErrorDiagnostic(stream, "setting Resource Data", err) - return - } - - if !push(result) { - return - } - } - } -} - -func (r *NetworkSecurityGroupListResource) Configure(_ context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) { - r.Defaults(request, response) -} - -func (r *NetworkSecurityGroupListResource) RawV5Schemas(ctx context.Context, _ list.RawV5SchemaRequest, response *list.RawV5SchemaResponse) { - res := resourceNetworkSecurityGroup() - response.ProtoV5Schema = res.ProtoSchema(ctx)() - response.ProtoV5IdentitySchema = res.ProtoIdentitySchema(ctx)() -} diff --git a/internal/services/network/network_security_group_resource_list.go b/internal/services/network/network_security_group_resource_list.go new file mode 100644 index 000000000000..a1d032f20482 --- /dev/null +++ b/internal/services/network/network_security_group_resource_list.go @@ -0,0 +1,115 @@ +package network + +import ( + "context" + "fmt" + "time" + + "github.com/hashicorp/go-azure-helpers/lang/pointer" + "github.com/hashicorp/go-azure-helpers/resourcemanager/commonids" + "github.com/hashicorp/go-azure-sdk/resource-manager/network/2025-01-01/networksecuritygroups" + "github.com/hashicorp/terraform-plugin-framework/list" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/hashicorp/terraform-provider-azurerm/internal/sdk" + "github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" +) + +type NetworkSecurityGroupListResource struct{} + +var _ sdk.FrameworkListWrappedResource = new(NetworkSecurityGroupListResource) + +func (r NetworkSecurityGroupListResource) ResourceFunc() *pluginsdk.Resource { + return resourceNetworkSecurityGroup() +} + +func (r NetworkSecurityGroupListResource) Metadata(_ context.Context, _ resource.MetadataRequest, response *resource.MetadataResponse) { + response.TypeName = networkSecurityGroupResourceName +} + +func (r NetworkSecurityGroupListResource) List(ctx context.Context, request list.ListRequest, stream *list.ListResultsStream, metadata sdk.ResourceMetadata) { + client := metadata.Client.Network.NetworkSecurityGroups + + ctx, cancel := context.WithTimeout(ctx, time.Minute*60) + defer cancel() + + var data sdk.DefaultListModel + diags := request.Config.Get(ctx, &data) + if diags.HasError() { + stream.Results = list.ListResultsStreamDiagnostics(diags) + return + } + + results := make([]networksecuritygroups.NetworkSecurityGroup, 0) + + subscriptionID := metadata.SubscriptionId + if !data.SubscriptionId.IsNull() { + subscriptionID = data.SubscriptionId.ValueString() + } + + switch { + case !data.ResourceGroupName.IsNull(): + resp, err := client.ListComplete(ctx, commonids.NewResourceGroupID(subscriptionID, data.ResourceGroupName.ValueString())) + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", networkSecurityGroupResourceName), err) + return + } + + results = resp.Items + default: + resp, err := client.ListAllComplete(ctx, commonids.NewSubscriptionID(subscriptionID)) + if err != nil { + sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", networkSecurityGroupResourceName), err) + return + } + + results = resp.Items + } + + stream.Results = func(push func(list.ListResult) bool) { + for _, nsg := range results { + result := request.NewListResult(ctx) + result.DisplayName = pointer.From(nsg.Name) + + id, err := networksecuritygroups.ParseNetworkSecurityGroupID(pointer.From(nsg.Id)) + if err != nil { + sdk.SetListIteratorErrorDiagnostic(result, push, "parsing Network Security Group ID", err) + return + } + + rd := resourceNetworkSecurityGroup().Data(&terraform.InstanceState{}) + rd.SetId(id.ID()) + + if err := resourceNetworkSecurityGroupFlatten(rd, id, &nsg); err != nil { + sdk.SetListIteratorErrorDiagnostic(result, push, fmt.Sprintf("encoding `%s` resource data", networkSecurityGroupResourceName), err) + return + } + + tfTypeIdentity, err := rd.TfTypeIdentityState() + if err != nil { + sdk.SetListIteratorErrorDiagnostic(result, push, "converting Identity State", err) + return + } + + if err := result.Identity.Set(ctx, *tfTypeIdentity); err != nil { + sdk.SetListIteratorErrorDiagnostic(result, push, "setting Identity Data", err) + return + } + + tfTypeResourceState, err := rd.TfTypeResourceState() + if err != nil { + sdk.SetListIteratorErrorDiagnostic(result, push, "converting Resource State", err) + return + } + + if err := result.Resource.Set(ctx, *tfTypeResourceState); err != nil { + sdk.SetListIteratorErrorDiagnostic(result, push, "setting Resource Data", err) + return + } + + if !push(result) { + return + } + } + } +} diff --git a/internal/services/network/network_security_group_list_resource_test.go b/internal/services/network/network_security_group_resource_list_test.go similarity index 82% rename from internal/services/network/network_security_group_list_resource_test.go rename to internal/services/network/network_security_group_resource_list_test.go index a65d82eebcc3..91397b373bf6 100644 --- a/internal/services/network/network_security_group_list_resource_test.go +++ b/internal/services/network/network_security_group_resource_list_test.go @@ -28,7 +28,12 @@ func TestAccNetworkSecurityGroup_list_basic(t *testing.T) { }, { Query: true, - Config: r.basicListQuery(data), + Config: r.basicQuery(), + ConfigQueryChecks: []querycheck.QueryCheck{}, // TODO + }, + { + Query: true, + Config: r.basicQueryByResourceGroupName(data), ConfigQueryChecks: []querycheck.QueryCheck{}, // TODO }, }, @@ -66,7 +71,16 @@ resource "azurerm_network_security_group" "test3" { `, data.RandomInteger, data.Locations.Primary) } -func (r NetworkSecurityGroupResource) basicListQuery(data acceptance.TestData) string { +func (r NetworkSecurityGroupResource) basicQuery() string { + return ` +list "azurerm_network_security_group" "list" { + provider = azurerm + config {} +} +` +} + +func (r NetworkSecurityGroupResource) basicQueryByResourceGroupName(data acceptance.TestData) string { return fmt.Sprintf(` list "azurerm_network_security_group" "list" { provider = azurerm diff --git a/internal/services/network/registration.go b/internal/services/network/registration.go index 6c9800f6e43c..902901542c19 100644 --- a/internal/services/network/registration.go +++ b/internal/services/network/registration.go @@ -200,6 +200,7 @@ func (r Registration) Actions() []func() action.Action { func (r Registration) ListResources() []sdk.FrameworkListWrappedResource { return []sdk.FrameworkListWrappedResource{ NetworkInterfaceListResource{}, + NetworkSecurityGroupListResource{}, VirtualNetworkListResource{}, } }