Skip to content

Commit a74a038

Browse files
list and identity - azurerm_servicebus_customer_managed_identity (#32315)
[FEATURE] * **New List Resource**: `azurerm_servicebus_customer_managed_identity`
1 parent f4f593e commit a74a038

6 files changed

Lines changed: 313 additions & 19 deletions

internal/services/servicebus/registration.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func (r Registration) EphemeralResources() []func() ephemeral.EphemeralResource
9696

9797
func (r Registration) ListResources() []sdk.FrameworkListWrappedResource {
9898
return []sdk.FrameworkListWrappedResource{
99+
ServiceBusNamespaceCustomerManagedKeyListResource{},
99100
ServiceBusNamespaceListResource{},
100101
}
101102
}

internal/services/servicebus/servicebus_namespace_customer_managed_key_resource.go

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ import (
1212
"github.com/hashicorp/go-azure-helpers/lang/pointer"
1313
"github.com/hashicorp/go-azure-helpers/lang/response"
1414
"github.com/hashicorp/go-azure-helpers/resourcemanager/keyvault"
15+
"github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids"
1516
"github.com/hashicorp/go-azure-sdk/resource-manager/servicebus/2024-01-01/namespaces"
1617
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
1718
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
1819
)
1920

21+
//go:generate go run ../../tools/generator-tests resourceidentity -resource-name servicebus_namespace_customer_managed_key -service-package-name servicebus -compare-values "subscription_id:namespace_id,resource_group_name:namespace_id,name:namespace_id"
22+
2023
type ServiceBusNamespaceCustomerManagedKeyResource struct{}
2124

2225
type ServiceBusNamespaceCustomerManagedKeyModel struct {
@@ -25,7 +28,14 @@ type ServiceBusNamespaceCustomerManagedKeyModel struct {
2528
InfrastructureEncryptionEnabled bool `tfschema:"infrastructure_encryption_enabled"`
2629
}
2730

28-
var _ sdk.ResourceWithUpdate = ServiceBusNamespaceCustomerManagedKeyResource{}
31+
var (
32+
_ sdk.ResourceWithIdentity = ServiceBusNamespaceCustomerManagedKeyResource{}
33+
_ sdk.ResourceWithUpdate = ServiceBusNamespaceCustomerManagedKeyResource{}
34+
)
35+
36+
func (r ServiceBusNamespaceCustomerManagedKeyResource) Identity() resourceids.ResourceId {
37+
return &namespaces.NamespaceId{}
38+
}
2939

3040
func (r ServiceBusNamespaceCustomerManagedKeyResource) ModelObject() interface{} {
3141
return &ServiceBusNamespaceCustomerManagedKeyModel{}
@@ -119,10 +129,13 @@ func (r ServiceBusNamespaceCustomerManagedKeyResource) Create() sdk.ResourceFunc
119129
},
120130
}
121131

122-
if err := client.CreateOrUpdateCallbackThenPoll(ctx, *id, *payload, metadata.SetIDCallback(id)); err != nil {
132+
if err := client.CreateOrUpdateCallbackThenPoll(ctx, *id, *payload, metadata.SetIDAndIdentityCallback(id)); err != nil {
123133
return fmt.Errorf("creating Customer Managed Key for %s: %+v", *id, err)
124134
}
125135
metadata.SetID(id)
136+
if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, id); err != nil {
137+
return err
138+
}
126139

127140
return nil
128141
},
@@ -148,23 +161,7 @@ func (r ServiceBusNamespaceCustomerManagedKeyResource) Read() sdk.ResourceFunc {
148161
return fmt.Errorf("retrieving %s: %+v", *id, err)
149162
}
150163

151-
var state ServiceBusNamespaceCustomerManagedKeyModel
152-
state.NamespaceID = id.ID()
153-
154-
if model := resp.Model; model != nil {
155-
if props := model.Properties; props != nil && props.Encryption != nil {
156-
encryption := props.Encryption
157-
if keyVaultProperties := encryption.KeyVaultProperties; keyVaultProperties != nil && len(*keyVaultProperties) > 0 {
158-
keyVaultKeyId, err := keyvault.NewNestedItemID(pointer.From((*keyVaultProperties)[0].KeyVaultUri), keyvault.NestedItemTypeKey, pointer.From((*keyVaultProperties)[0].KeyName), pointer.From((*keyVaultProperties)[0].KeyVersion))
159-
if err != nil {
160-
return fmt.Errorf("parsing `key_vault_key_id`: %+v", err)
161-
}
162-
state.KeyVaultKeyID = keyVaultKeyId.ID()
163-
}
164-
state.InfrastructureEncryptionEnabled = pointer.From(encryption.RequireInfrastructureEncryption)
165-
}
166-
}
167-
return metadata.Encode(&state)
164+
return r.flatten(metadata, id, resp.Model)
168165
},
169166
}
170167
}
@@ -236,3 +233,31 @@ func (r ServiceBusNamespaceCustomerManagedKeyResource) Delete() sdk.ResourceFunc
236233
},
237234
}
238235
}
236+
237+
func (r ServiceBusNamespaceCustomerManagedKeyResource) flatten(metadata sdk.ResourceMetaData, id *namespaces.NamespaceId, model *namespaces.SBNamespace) error {
238+
state := ServiceBusNamespaceCustomerManagedKeyModel{
239+
NamespaceID: id.ID(),
240+
}
241+
242+
if model != nil {
243+
if props := model.Properties; props != nil && props.Encryption != nil {
244+
encryption := props.Encryption
245+
if keyVaultProperties := encryption.KeyVaultProperties; keyVaultProperties != nil && len(*keyVaultProperties) > 0 {
246+
keyVaultKeyId, err := keyvault.NewNestedItemID(pointer.From((*keyVaultProperties)[0].KeyVaultUri), keyvault.NestedItemTypeKey, pointer.From((*keyVaultProperties)[0].KeyName), pointer.From((*keyVaultProperties)[0].KeyVersion))
247+
if err != nil {
248+
return fmt.Errorf("parsing `key_vault_key_id`: %+v", err)
249+
}
250+
251+
state.KeyVaultKeyID = keyVaultKeyId.ID()
252+
}
253+
254+
state.InfrastructureEncryptionEnabled = pointer.From(encryption.RequireInfrastructureEncryption)
255+
}
256+
}
257+
258+
if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, id); err != nil {
259+
return err
260+
}
261+
262+
return metadata.Encode(&state)
263+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright IBM Corp. 2014, 2025
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package servicebus_test
5+
6+
import (
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-testing/statecheck"
10+
"github.com/hashicorp/terraform-plugin-testing/tfjsonpath"
11+
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
12+
customstatecheck "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/statecheck"
13+
)
14+
15+
func TestAccServicebusNamespaceCustomerManagedKey_resourceIdentity(t *testing.T) {
16+
data := acceptance.BuildTestData(t, "azurerm_servicebus_namespace_customer_managed_key", "test")
17+
r := ServicebusNamespaceCustomerManagedKeyResource{}
18+
19+
checkedFields := map[string]struct{}{
20+
"name": {},
21+
"resource_group_name": {},
22+
"subscription_id": {},
23+
}
24+
25+
data.ResourceIdentityTest(t, []acceptance.TestStep{
26+
{
27+
Config: r.basic(data),
28+
ConfigStateChecks: []statecheck.StateCheck{
29+
customstatecheck.ExpectAllIdentityFieldsAreChecked("azurerm_servicebus_namespace_customer_managed_key.test", checkedFields),
30+
customstatecheck.ExpectStateContainsIdentityValueAtPath("azurerm_servicebus_namespace_customer_managed_key.test", tfjsonpath.New("name"), tfjsonpath.New("namespace_id")),
31+
customstatecheck.ExpectStateContainsIdentityValueAtPath("azurerm_servicebus_namespace_customer_managed_key.test", tfjsonpath.New("resource_group_name"), tfjsonpath.New("namespace_id")),
32+
customstatecheck.ExpectStateContainsIdentityValueAtPath("azurerm_servicebus_namespace_customer_managed_key.test", tfjsonpath.New("subscription_id"), tfjsonpath.New("namespace_id")),
33+
},
34+
},
35+
data.ImportBlockWithResourceIdentityStep(false),
36+
data.ImportBlockWithIDStep(false),
37+
}, false)
38+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright IBM Corp. 2014, 2026
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package servicebus
5+
6+
import (
7+
"context"
8+
"fmt"
9+
10+
"github.com/hashicorp/go-azure-helpers/lang/pointer"
11+
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonids"
12+
"github.com/hashicorp/go-azure-sdk/resource-manager/servicebus/2024-01-01/namespaces"
13+
"github.com/hashicorp/terraform-plugin-framework/list"
14+
"github.com/hashicorp/terraform-plugin-framework/resource"
15+
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
16+
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
17+
)
18+
19+
type ServiceBusNamespaceCustomerManagedKeyListResource struct{}
20+
21+
var _ sdk.FrameworkListWrappedResource = new(ServiceBusNamespaceCustomerManagedKeyListResource)
22+
23+
func (ServiceBusNamespaceCustomerManagedKeyListResource) Metadata(_ context.Context, _ resource.MetadataRequest, response *resource.MetadataResponse) {
24+
response.TypeName = ServiceBusNamespaceCustomerManagedKeyResource{}.ResourceType()
25+
}
26+
27+
func (ServiceBusNamespaceCustomerManagedKeyListResource) ResourceFunc() *pluginsdk.Resource {
28+
return sdk.WrappedResource(ServiceBusNamespaceCustomerManagedKeyResource{})
29+
}
30+
31+
func (ServiceBusNamespaceCustomerManagedKeyListResource) List(ctx context.Context, request list.ListRequest, stream *list.ListResultsStream, metadata sdk.ResourceMetadata) {
32+
client := metadata.Client.ServiceBus.NamespacesClient
33+
34+
var data sdk.DefaultListModel
35+
diags := request.Config.Get(ctx, &data)
36+
if diags.HasError() {
37+
stream.Results = list.ListResultsStreamDiagnostics(diags)
38+
return
39+
}
40+
41+
subscriptionID := metadata.SubscriptionId
42+
if !data.SubscriptionId.IsNull() {
43+
subscriptionID = data.SubscriptionId.ValueString()
44+
}
45+
46+
var results []namespaces.SBNamespace
47+
resource := ServiceBusNamespaceCustomerManagedKeyResource{}
48+
49+
switch {
50+
case !data.ResourceGroupName.IsNull():
51+
resp, err := client.ListByResourceGroupComplete(ctx, commonids.NewResourceGroupID(subscriptionID, data.ResourceGroupName.ValueString()))
52+
if err != nil {
53+
sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", resource.ResourceType()), err)
54+
return
55+
}
56+
57+
results = resp.Items
58+
default:
59+
resp, err := client.ListComplete(ctx, commonids.NewSubscriptionID(subscriptionID))
60+
if err != nil {
61+
sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", resource.ResourceType()), err)
62+
return
63+
}
64+
65+
results = resp.Items
66+
}
67+
68+
stream.Results = func(push func(list.ListResult) bool) {
69+
for _, item := range results {
70+
if item.Properties == nil || item.Properties.Encryption == nil || item.Properties.Encryption.KeyVaultProperties == nil || len(*item.Properties.Encryption.KeyVaultProperties) == 0 {
71+
continue
72+
}
73+
74+
result := request.NewListResult(ctx)
75+
result.DisplayName = pointer.From(item.Name)
76+
77+
id, err := namespaces.ParseNamespaceID(pointer.From(item.Id))
78+
if err != nil {
79+
sdk.SetErrorDiagnosticAndPushListResult(result, push, "parsing Service Bus Namespace ID", err)
80+
return
81+
}
82+
83+
meta := sdk.NewResourceMetaData(metadata.Client, resource)
84+
meta.SetID(id)
85+
86+
if err := resource.flatten(meta, id, &item); err != nil {
87+
sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", resource.ResourceType()), err)
88+
return
89+
}
90+
91+
sdk.EncodeListResult(ctx, meta.ResourceData, &result)
92+
if result.Diagnostics.HasError() {
93+
push(result)
94+
return
95+
}
96+
97+
if !push(result) {
98+
return
99+
}
100+
}
101+
}
102+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright IBM Corp. 2014, 2026
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package servicebus_test
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"regexp"
10+
"strconv"
11+
"testing"
12+
13+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
14+
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
15+
"github.com/hashicorp/terraform-plugin-testing/querycheck"
16+
"github.com/hashicorp/terraform-plugin-testing/tfversion"
17+
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
18+
"github.com/hashicorp/terraform-provider-azurerm/internal/provider/framework"
19+
)
20+
21+
func TestAccServicebusNamespaceCustomerManagedKey_list(t *testing.T) {
22+
data := acceptance.BuildTestData(t, "azurerm_servicebus_namespace_customer_managed_key", "testlist")
23+
r := ServicebusNamespaceCustomerManagedKeyResource{}
24+
25+
resource.Test(t, resource.TestCase{
26+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
27+
tfversion.SkipBelow(tfversion.Version1_14_0),
28+
},
29+
ProtoV5ProviderFactories: framework.ProtoV5ProviderFactoriesInit(context.Background(), "azurerm"),
30+
Steps: []resource.TestStep{
31+
{
32+
Config: r.basic(data),
33+
},
34+
{
35+
Query: true,
36+
Config: r.basicListQuery(),
37+
QueryResultChecks: []querycheck.QueryResultCheck{
38+
querycheck.ExpectLengthAtLeast("azurerm_servicebus_namespace_customer_managed_key.list", 1),
39+
querycheck.ExpectIdentity(
40+
"azurerm_servicebus_namespace_customer_managed_key.list",
41+
map[string]knownvalue.Check{
42+
"name": knownvalue.StringRegexp(regexp.MustCompile(strconv.Itoa(data.RandomInteger))),
43+
"resource_group_name": knownvalue.StringRegexp(regexp.MustCompile(strconv.Itoa(data.RandomInteger))),
44+
"subscription_id": knownvalue.StringExact(data.Subscriptions.Primary),
45+
},
46+
),
47+
},
48+
},
49+
{
50+
Query: true,
51+
Config: r.basicListQueryByResourceGroupName(data),
52+
QueryResultChecks: []querycheck.QueryResultCheck{
53+
querycheck.ExpectLength("azurerm_servicebus_namespace_customer_managed_key.list", 1),
54+
querycheck.ExpectIdentity(
55+
"azurerm_servicebus_namespace_customer_managed_key.list",
56+
map[string]knownvalue.Check{
57+
"name": knownvalue.StringRegexp(regexp.MustCompile(strconv.Itoa(data.RandomInteger))),
58+
"resource_group_name": knownvalue.StringRegexp(regexp.MustCompile(strconv.Itoa(data.RandomInteger))),
59+
"subscription_id": knownvalue.StringExact(data.Subscriptions.Primary),
60+
},
61+
),
62+
},
63+
},
64+
},
65+
})
66+
}
67+
68+
func (r ServicebusNamespaceCustomerManagedKeyResource) basicListQuery() string {
69+
return `
70+
list "azurerm_servicebus_namespace_customer_managed_key" "list" {
71+
provider = azurerm
72+
config {}
73+
}
74+
`
75+
}
76+
77+
func (r ServicebusNamespaceCustomerManagedKeyResource) basicListQueryByResourceGroupName(data acceptance.TestData) string {
78+
return fmt.Sprintf(`
79+
list "azurerm_servicebus_namespace_customer_managed_key" "list" {
80+
provider = azurerm
81+
config {
82+
subscription_id = "%s"
83+
resource_group_name = "acctest-sb-%d"
84+
}
85+
}
86+
`, data.Subscriptions.Primary, data.RandomInteger)
87+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
subcategory: "Messaging"
3+
layout: "azurerm"
4+
page_title: "Azure Resource Manager: azurerm_servicebus_namespace_customer_managed_key"
5+
description: |-
6+
Lists Service Bus Namespace Customer Managed Key resources.
7+
---
8+
9+
# List resource: azurerm_servicebus_namespace_customer_managed_key
10+
11+
Lists Service Bus Namespace Customer Managed Key resources.
12+
13+
## Example Usage
14+
15+
### List all Service Bus Namespace Customer Managed Keys in the subscription
16+
17+
```hcl
18+
list "azurerm_servicebus_namespace_customer_managed_key" "example" {
19+
provider = azurerm
20+
config {}
21+
}
22+
```
23+
24+
### List all Service Bus Namespace Customer Managed Keys in a specific resource group
25+
26+
```hcl
27+
list "azurerm_servicebus_namespace_customer_managed_key" "example" {
28+
provider = azurerm
29+
config {
30+
resource_group_name = "example-rg"
31+
}
32+
}
33+
```
34+
35+
## Argument Reference
36+
37+
This list resource supports the following arguments:
38+
39+
* `resource_group_name` - (Optional) The name of the resource group to query.
40+
41+
* `subscription_id` - (Optional) The Subscription ID to query. Defaults to the value specified in the Provider Configuration.

0 commit comments

Comments
 (0)