Skip to content

Commit dd083a5

Browse files
List and identity implementation - azurerm_web_pubsub (#32126)
Co-authored-by: mstroob <37002354+mstroob@users.noreply.github.com>
1 parent 5956955 commit dd083a5

6 files changed

Lines changed: 349 additions & 78 deletions

File tree

internal/services/signalr/registration.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,7 @@ func (r Registration) EphemeralResources() []func() ephemeral.EphemeralResource
8888
}
8989

9090
func (r Registration) ListResources() []sdk.FrameworkListWrappedResource {
91-
return []sdk.FrameworkListWrappedResource{}
91+
return []sdk.FrameworkListWrappedResource{
92+
WebPubSubListResource{},
93+
}
9294
}

internal/services/signalr/web_pubsub_resource.go

Lines changed: 90 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ import (
2828
"github.com/hashicorp/terraform-provider-azurerm/internal/timeouts"
2929
)
3030

31+
//go:generate go run ../../tools/generator-tests resourceidentity -resource-name web_pubsub -service-package-name signalr -properties "name,resource_group_name"
32+
33+
const webPubSubResourceType = "azurerm_web_pubsub"
34+
3135
func resourceWebPubSub() *pluginsdk.Resource {
3236
return &pluginsdk.Resource{
3337
Create: resourceWebPubSubCreateUpdate,
@@ -47,10 +51,11 @@ func resourceWebPubSub() *pluginsdk.Resource {
4751
}),
4852
SchemaVersion: 1,
4953

50-
Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
51-
_, err := webpubsub.ParseWebPubSubID(id)
52-
return err
53-
}),
54+
Importer: pluginsdk.ImporterValidatingIdentity(&webpubsub.WebPubSubId{}),
55+
56+
Identity: &schema.ResourceIdentity{
57+
SchemaFunc: pluginsdk.GenerateIdentitySchema(&webpubsub.WebPubSubId{}),
58+
},
5459

5560
Schema: map[string]*pluginsdk.Schema{
5661
"name": {
@@ -219,7 +224,7 @@ func resourceWebPubSubCreateUpdate(d *pluginsdk.ResourceData, meta interface{})
219224
}
220225
}
221226
if !response.WasNotFound(existing.HttpResponse) {
222-
return tf.ImportAsExistsError("azurerm_web_pubsub", id.ID())
227+
return tf.ImportAsExistsError(webPubSubResourceType, id.ID())
223228
}
224229
}
225230

@@ -279,6 +284,10 @@ func resourceWebPubSubCreateUpdate(d *pluginsdk.ResourceData, meta interface{})
279284
}
280285

281286
d.SetId(id.ID())
287+
if err := pluginsdk.SetResourceIdentityData(d, &id); err != nil {
288+
return err
289+
}
290+
282291
return resourceWebPubSubRead(d, meta)
283292
}
284293

@@ -307,78 +316,7 @@ func resourceWebPubSubRead(d *pluginsdk.ResourceData, meta interface{}) error {
307316
return fmt.Errorf("listing keys for %s: %+v", *id, err)
308317
}
309318

310-
d.Set("name", id.WebPubSubName)
311-
d.Set("resource_group_name", id.ResourceGroupName)
312-
313-
if model := resp.Model; model != nil {
314-
d.Set("location", location.Normalize(model.Location))
315-
316-
skuName := ""
317-
skuCapacity := int64(0)
318-
if model.Sku != nil {
319-
skuName = model.Sku.Name
320-
skuCapacity = *model.Sku.Capacity
321-
}
322-
d.Set("sku", skuName)
323-
d.Set("capacity", skuCapacity)
324-
325-
if props := model.Properties; props != nil {
326-
d.Set("external_ip", props.ExternalIP)
327-
d.Set("hostname", props.HostName)
328-
d.Set("public_port", props.PublicPort)
329-
d.Set("server_port", props.ServerPort)
330-
d.Set("version", props.Version)
331-
332-
aadAuthEnabled := true
333-
if props.DisableAadAuth != nil {
334-
aadAuthEnabled = !(*props.DisableAadAuth)
335-
}
336-
d.Set("aad_auth_enabled", aadAuthEnabled)
337-
338-
disableLocalAuth := false
339-
if props.DisableLocalAuth != nil {
340-
disableLocalAuth = !(*props.DisableLocalAuth)
341-
}
342-
d.Set("local_auth_enabled", disableLocalAuth)
343-
344-
publicNetworkAccessEnabled := true
345-
if props.PublicNetworkAccess != nil {
346-
publicNetworkAccessEnabled = strings.EqualFold(*props.PublicNetworkAccess, "Enabled")
347-
}
348-
d.Set("public_network_access_enabled", publicNetworkAccessEnabled)
349-
350-
tlsClientCertEnabled := false
351-
if props.Tls != nil && props.Tls.ClientCertEnabled != nil {
352-
tlsClientCertEnabled = *props.Tls.ClientCertEnabled
353-
}
354-
d.Set("tls_client_cert_enabled", tlsClientCertEnabled)
355-
356-
if err := d.Set("live_trace", flattenLiveTraceConfig(props.LiveTraceConfiguration)); err != nil {
357-
return fmt.Errorf("setting `live_trace`:%+v", err)
358-
}
359-
360-
identity, err := identity.FlattenSystemOrUserAssignedMap(model.Identity)
361-
if err != nil {
362-
return fmt.Errorf("flattening `identity`: %+v", err)
363-
}
364-
if err := d.Set("identity", identity); err != nil {
365-
return fmt.Errorf("setting `identity`: %+v", err)
366-
}
367-
368-
if err := tags.FlattenAndSet(d, model.Tags); err != nil {
369-
return fmt.Errorf("setting `tags`: %+v", err)
370-
}
371-
}
372-
}
373-
374-
if model := keys.Model; model != nil {
375-
d.Set("primary_access_key", model.PrimaryKey)
376-
d.Set("primary_connection_string", model.PrimaryConnectionString)
377-
d.Set("secondary_access_key", model.SecondaryKey)
378-
d.Set("secondary_connection_string", model.SecondaryConnectionString)
379-
}
380-
381-
return nil
319+
return resourceWebPubSubFlatten(d, id, resp.Model, keys.Model)
382320
}
383321

384322
func resourceWebPubSubDelete(d *pluginsdk.ResourceData, meta interface{}) error {
@@ -515,3 +453,78 @@ func webPubsubProvisioningStateRefreshFunc(ctx context.Context, client *webpubsu
515453
return res, provisioningState, nil
516454
}
517455
}
456+
457+
func resourceWebPubSubFlatten(d *pluginsdk.ResourceData, id *webpubsub.WebPubSubId, model *webpubsub.WebPubSubResource, keyModel *webpubsub.WebPubSubKeys) error {
458+
d.Set("name", id.WebPubSubName)
459+
d.Set("resource_group_name", id.ResourceGroupName)
460+
461+
if model != nil {
462+
d.Set("location", location.Normalize(model.Location))
463+
464+
skuName := ""
465+
skuCapacity := int64(0)
466+
if model.Sku != nil {
467+
skuName = model.Sku.Name
468+
skuCapacity = *model.Sku.Capacity
469+
}
470+
d.Set("sku", skuName)
471+
d.Set("capacity", skuCapacity)
472+
473+
if props := model.Properties; props != nil {
474+
d.Set("external_ip", props.ExternalIP)
475+
d.Set("hostname", props.HostName)
476+
d.Set("public_port", props.PublicPort)
477+
d.Set("server_port", props.ServerPort)
478+
d.Set("version", props.Version)
479+
480+
aadAuthEnabled := true
481+
if props.DisableAadAuth != nil {
482+
aadAuthEnabled = !(*props.DisableAadAuth)
483+
}
484+
d.Set("aad_auth_enabled", aadAuthEnabled)
485+
486+
disableLocalAuth := false
487+
if props.DisableLocalAuth != nil {
488+
disableLocalAuth = !(*props.DisableLocalAuth)
489+
}
490+
d.Set("local_auth_enabled", disableLocalAuth)
491+
492+
publicNetworkAccessEnabled := true
493+
if props.PublicNetworkAccess != nil {
494+
publicNetworkAccessEnabled = strings.EqualFold(*props.PublicNetworkAccess, "Enabled")
495+
}
496+
d.Set("public_network_access_enabled", publicNetworkAccessEnabled)
497+
498+
tlsClientCertEnabled := false
499+
if props.Tls != nil && props.Tls.ClientCertEnabled != nil {
500+
tlsClientCertEnabled = *props.Tls.ClientCertEnabled
501+
}
502+
d.Set("tls_client_cert_enabled", tlsClientCertEnabled)
503+
504+
if err := d.Set("live_trace", flattenLiveTraceConfig(props.LiveTraceConfiguration)); err != nil {
505+
return fmt.Errorf("setting `live_trace`:%+v", err)
506+
}
507+
508+
identityValue, err := identity.FlattenSystemOrUserAssignedMap(model.Identity)
509+
if err != nil {
510+
return fmt.Errorf("flattening `identity`: %+v", err)
511+
}
512+
if err := d.Set("identity", identityValue); err != nil {
513+
return fmt.Errorf("setting `identity`: %+v", err)
514+
}
515+
516+
if err := tags.FlattenAndSet(d, model.Tags); err != nil {
517+
return fmt.Errorf("setting `tags`: %+v", err)
518+
}
519+
}
520+
}
521+
522+
if keyModel != nil {
523+
d.Set("primary_access_key", keyModel.PrimaryKey)
524+
d.Set("primary_connection_string", keyModel.PrimaryConnectionString)
525+
d.Set("secondary_access_key", keyModel.SecondaryKey)
526+
d.Set("secondary_connection_string", keyModel.SecondaryConnectionString)
527+
}
528+
529+
return pluginsdk.SetResourceIdentityData(d, id)
530+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright IBM Corp. 2014, 2025
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package signalr_test
5+
6+
import (
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
10+
"github.com/hashicorp/terraform-plugin-testing/statecheck"
11+
"github.com/hashicorp/terraform-plugin-testing/tfjsonpath"
12+
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
13+
customstatecheck "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/statecheck"
14+
)
15+
16+
func TestAccWebPubsub_resourceIdentity(t *testing.T) {
17+
data := acceptance.BuildTestData(t, "azurerm_web_pubsub", "test")
18+
r := WebPubsubResource{}
19+
20+
checkedFields := map[string]struct{}{
21+
"subscription_id": {},
22+
"name": {},
23+
"resource_group_name": {},
24+
}
25+
26+
data.ResourceIdentityTest(t, []acceptance.TestStep{
27+
{
28+
Config: r.basic(data),
29+
ConfigStateChecks: []statecheck.StateCheck{
30+
customstatecheck.ExpectAllIdentityFieldsAreChecked("azurerm_web_pubsub.test", checkedFields),
31+
statecheck.ExpectIdentityValue("azurerm_web_pubsub.test", tfjsonpath.New("subscription_id"), knownvalue.StringExact(data.Subscriptions.Primary)),
32+
statecheck.ExpectIdentityValueMatchesStateAtPath("azurerm_web_pubsub.test", tfjsonpath.New("name"), tfjsonpath.New("name")),
33+
statecheck.ExpectIdentityValueMatchesStateAtPath("azurerm_web_pubsub.test", tfjsonpath.New("resource_group_name"), tfjsonpath.New("resource_group_name")),
34+
},
35+
},
36+
data.ImportBlockWithResourceIdentityStep(false),
37+
data.ImportBlockWithIDStep(false),
38+
}, false)
39+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright IBM Corp. 2014, 2025
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package signalr
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/webpubsub/2024-03-01/webpubsub"
13+
"github.com/hashicorp/terraform-plugin-framework/list"
14+
"github.com/hashicorp/terraform-plugin-framework/resource"
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
16+
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
17+
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
18+
)
19+
20+
type WebPubSubListResource struct{}
21+
22+
var _ sdk.FrameworkListWrappedResource = new(WebPubSubListResource)
23+
24+
func (r WebPubSubListResource) ResourceFunc() *pluginsdk.Resource {
25+
return resourceWebPubSub()
26+
}
27+
28+
func (r WebPubSubListResource) Metadata(_ context.Context, _ resource.MetadataRequest, response *resource.MetadataResponse) {
29+
response.TypeName = webPubSubResourceType
30+
}
31+
32+
func (r WebPubSubListResource) List(ctx context.Context, request list.ListRequest, stream *list.ListResultsStream, metadata sdk.ResourceMetadata) {
33+
client := metadata.Client.SignalR.WebPubSubClient.WebPubSub
34+
35+
var data sdk.DefaultListModel
36+
if diags := request.Config.Get(ctx, &data); 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+
results := make([]webpubsub.WebPubSubResource, 0)
47+
48+
switch {
49+
case !data.ResourceGroupName.IsNull():
50+
resp, err := client.ListByResourceGroupComplete(ctx, commonids.NewResourceGroupID(subscriptionID, data.ResourceGroupName.ValueString()))
51+
if err != nil {
52+
sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", webPubSubResourceType), err)
53+
return
54+
}
55+
results = resp.Items
56+
default:
57+
resp, err := client.ListBySubscriptionComplete(ctx, commonids.NewSubscriptionID(subscriptionID))
58+
if err != nil {
59+
sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", webPubSubResourceType), err)
60+
return
61+
}
62+
results = resp.Items
63+
}
64+
65+
stream.Results = func(push func(list.ListResult) bool) {
66+
for _, item := range results {
67+
result := request.NewListResult(ctx)
68+
result.DisplayName = pointer.From(item.Name)
69+
70+
id, err := webpubsub.ParseWebPubSubIDInsensitively(pointer.From(item.Id))
71+
if err != nil {
72+
sdk.SetErrorDiagnosticAndPushListResult(result, push, "parsing Web PubSub ID", err)
73+
return
74+
}
75+
76+
rd := resourceWebPubSub().Data(&terraform.InstanceState{})
77+
rd.SetId(id.ID())
78+
79+
if err := resourceWebPubSubFlatten(rd, id, &item, nil); err != nil {
80+
sdk.SetErrorDiagnosticAndPushListResult(result, push, "flattening Web PubSub", err)
81+
return
82+
}
83+
84+
sdk.EncodeListResult(ctx, rd, &result)
85+
if result.Diagnostics.HasError() {
86+
push(result)
87+
return
88+
}
89+
if !push(result) {
90+
return
91+
}
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)