Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding shared private link resource for the Azure web pubsub resource #15550

Merged
merged 15 commits into from
Jul 20, 2022
22 changes: 16 additions & 6 deletions internal/services/signalr/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ import (
)

type Client struct {
SignalRClient *signalr.SignalRClient
WebPubsubClient *webpubsub.Client
WebPubsubHubsClient *webpubsub.HubsClient
SignalRClient *signalr.SignalRClient
WebPubsubClient *webpubsub.Client
WebPubsubHubsClient *webpubsub.HubsClient
WebPubsubSharedPrivateLinkResourceClient *webpubsub.SharedPrivateLinkResourcesClient
WebPubsubPrivateLinkedResourceClient *webpubsub.PrivateLinkResourcesClient
}

func NewClient(o *common.ClientOptions) *Client {
Expand All @@ -22,9 +24,17 @@ func NewClient(o *common.ClientOptions) *Client {
webpubsubHubsClient := webpubsub.NewHubsClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&webpubsubHubsClient.Client, o.ResourceManagerAuthorizer)

webPubsubSharedPrivateLinkResourceClient := webpubsub.NewSharedPrivateLinkResourcesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&webPubsubSharedPrivateLinkResourceClient.Client, o.ResourceManagerAuthorizer)

webPubsubPrivateLinkResourceClient := webpubsub.NewPrivateLinkResourcesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&webPubsubPrivateLinkResourceClient.Client, o.ResourceManagerAuthorizer)

return &Client{
SignalRClient: &signalRClient,
WebPubsubClient: &webpubsubClient,
WebPubsubHubsClient: &webpubsubHubsClient,
SignalRClient: &signalRClient,
WebPubsubClient: &webpubsubClient,
WebPubsubHubsClient: &webpubsubHubsClient,
WebPubsubSharedPrivateLinkResourceClient: &webPubsubSharedPrivateLinkResourceClient,
WebPubsubPrivateLinkedResourceClient: &webPubsubPrivateLinkResourceClient,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package parse

// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten

import (
"fmt"
"strings"

"github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids"
)

type WebPubsubSharedPrivateLinkResourceId struct {
SubscriptionId string
ResourceGroup string
WebPubSubName string
SharedPrivateLinkResourceName string
}

func NewWebPubsubSharedPrivateLinkResourceID(subscriptionId, resourceGroup, webPubSubName, sharedPrivateLinkResourceName string) WebPubsubSharedPrivateLinkResourceId {
return WebPubsubSharedPrivateLinkResourceId{
SubscriptionId: subscriptionId,
ResourceGroup: resourceGroup,
WebPubSubName: webPubSubName,
SharedPrivateLinkResourceName: sharedPrivateLinkResourceName,
}
}

func (id WebPubsubSharedPrivateLinkResourceId) String() string {
segments := []string{
fmt.Sprintf("Shared Private Link Resource Name %q", id.SharedPrivateLinkResourceName),
fmt.Sprintf("Web Pub Sub Name %q", id.WebPubSubName),
fmt.Sprintf("Resource Group %q", id.ResourceGroup),
}
segmentsStr := strings.Join(segments, " / ")
return fmt.Sprintf("%s: (%s)", "Web Pubsub Shared Private Link Resource", segmentsStr)
}

func (id WebPubsubSharedPrivateLinkResourceId) ID() string {
fmtString := "/subscriptions/%s/resourcegroups/%s/providers/Microsoft.SignalRService/WebPubSub/%s/sharedPrivateLinkResources/%s"
return fmt.Sprintf(fmtString, id.SubscriptionId, id.ResourceGroup, id.WebPubSubName, id.SharedPrivateLinkResourceName)
}

// WebPubsubSharedPrivateLinkResourceID parses a WebPubsubSharedPrivateLinkResource ID into an WebPubsubSharedPrivateLinkResourceId struct
func WebPubsubSharedPrivateLinkResourceID(input string) (*WebPubsubSharedPrivateLinkResourceId, error) {
id, err := resourceids.ParseAzureResourceID(input)
if err != nil {
return nil, err
}

resourceId := WebPubsubSharedPrivateLinkResourceId{
SubscriptionId: id.SubscriptionID,
ResourceGroup: id.ResourceGroup,
}

if resourceId.SubscriptionId == "" {
return nil, fmt.Errorf("ID was missing the 'subscriptions' element")
}

if resourceId.ResourceGroup == "" {
return nil, fmt.Errorf("ID was missing the 'resourcegroups' element")
}

if resourceId.WebPubSubName, err = id.PopSegment("WebPubSub"); err != nil {
return nil, err
}
if resourceId.SharedPrivateLinkResourceName, err = id.PopSegment("sharedPrivateLinkResources"); err != nil {
return nil, err
}

if err := id.ValidateNoEmptySegments(input); err != nil {
return nil, err
}

return &resourceId, nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package parse

// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten

import (
"testing"

"github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids"
)

var _ resourceids.Id = WebPubsubSharedPrivateLinkResourceId{}

func TestWebPubsubSharedPrivateLinkResourceIDFormatter(t *testing.T) {
actual := NewWebPubsubSharedPrivateLinkResourceID("12345678-1234-9876-4563-123456789012", "resGroup1", "Webpubsub1", "resource1").ID()
expected := "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/sharedPrivateLinkResources/resource1"
if actual != expected {
t.Fatalf("Expected %q but got %q", expected, actual)
}
}

func TestWebPubsubSharedPrivateLinkResourceID(t *testing.T) {
testData := []struct {
Input string
Error bool
Expected *WebPubsubSharedPrivateLinkResourceId
}{

{
// empty
Input: "",
Error: true,
},

{
// missing SubscriptionId
Input: "/",
Error: true,
},

{
// missing value for SubscriptionId
Input: "/subscriptions/",
Error: true,
},

{
// missing ResourceGroup
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/",
Error: true,
},

{
// missing value for ResourceGroup
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/",
Error: true,
},

{
// missing WebPubSubName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/",
Error: true,
},

{
// missing value for WebPubSubName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/",
Error: true,
},

{
// missing SharedPrivateLinkResourceName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/",
Error: true,
},

{
// missing value for SharedPrivateLinkResourceName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/sharedPrivateLinkResources/",
Error: true,
},

{
// valid
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/sharedPrivateLinkResources/resource1",
Expected: &WebPubsubSharedPrivateLinkResourceId{
SubscriptionId: "12345678-1234-9876-4563-123456789012",
ResourceGroup: "resGroup1",
WebPubSubName: "Webpubsub1",
SharedPrivateLinkResourceName: "resource1",
},
},

{
// upper-cased
Input: "/SUBSCRIPTIONS/12345678-1234-9876-4563-123456789012/RESOURCEGROUPS/RESGROUP1/PROVIDERS/MICROSOFT.SIGNALRSERVICE/WEBPUBSUB/WEBPUBSUB1/SHAREDPRIVATELINKRESOURCES/RESOURCE1",
Error: true,
},
}

for _, v := range testData {
t.Logf("[DEBUG] Testing %q", v.Input)

actual, err := WebPubsubSharedPrivateLinkResourceID(v.Input)
if err != nil {
if v.Error {
continue
}

t.Fatalf("Expect a value but got an error: %s", err)
}
if v.Error {
t.Fatal("Expect an error but didn't get one")
}

if actual.SubscriptionId != v.Expected.SubscriptionId {
t.Fatalf("Expected %q but got %q for SubscriptionId", v.Expected.SubscriptionId, actual.SubscriptionId)
}
if actual.ResourceGroup != v.Expected.ResourceGroup {
t.Fatalf("Expected %q but got %q for ResourceGroup", v.Expected.ResourceGroup, actual.ResourceGroup)
}
if actual.WebPubSubName != v.Expected.WebPubSubName {
t.Fatalf("Expected %q but got %q for WebPubSubName", v.Expected.WebPubSubName, actual.WebPubSubName)
}
if actual.SharedPrivateLinkResourceName != v.Expected.SharedPrivateLinkResourceName {
t.Fatalf("Expected %q but got %q for SharedPrivateLinkResourceName", v.Expected.SharedPrivateLinkResourceName, actual.SharedPrivateLinkResourceName)
}
}
}
16 changes: 9 additions & 7 deletions internal/services/signalr/registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,20 @@ func (r Registration) WebsiteCategories() []string {
// SupportedDataSources returns the supported Data Sources supported by this Service
func (r Registration) SupportedDataSources() map[string]*pluginsdk.Resource {
return map[string]*pluginsdk.Resource{
"azurerm_signalr_service": dataSourceArmSignalRService(),
"azurerm_web_pubsub": dataSourceWebPubsub(),
"azurerm_signalr_service": dataSourceArmSignalRService(),
"azurerm_web_pubsub": dataSourceWebPubsub(),
"azurerm_web_pubsub_private_link_resource": dataSourceWebPubsubPrivateLinkResource(),
}
}

// SupportedResources returns the supported Resources supported by this Service
func (r Registration) SupportedResources() map[string]*pluginsdk.Resource {
return map[string]*pluginsdk.Resource{
"azurerm_signalr_service": resourceArmSignalRService(),
"azurerm_signalr_service_network_acl": resourceArmSignalRServiceNetworkACL(),
"azurerm_web_pubsub": resourceWebPubSub(),
"azurerm_web_pubsub_hub": resourceWebPubsubHub(),
"azurerm_web_pubsub_network_acl": resourceWebpubsubNetworkACL(),
"azurerm_signalr_service": resourceArmSignalRService(),
"azurerm_signalr_service_network_acl": resourceArmSignalRServiceNetworkACL(),
"azurerm_web_pubsub": resourceWebPubSub(),
"azurerm_web_pubsub_hub": resourceWebPubsubHub(),
"azurerm_web_pubsub_network_acl": resourceWebpubsubNetworkACL(),
"azurerm_web_pubsub_shared_private_link_resource": resourceWebpubsubSharedPrivateLinkService(),
}
}
1 change: 1 addition & 0 deletions internal/services/signalr/resourceids.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ package signalr

//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=WebPubsub -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=WebPubsubHub -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/hubs/Webpubsubhub1
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=WebPubsubSharedPrivateLinkResource -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/sharedPrivateLinkResources/resource1
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the casing here is wrong, this needs to be:

Suggested change
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=WebPubsubSharedPrivateLinkResource -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/sharedPrivateLinkResources/resource1
//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=WebPubsubSharedPrivateLinkResource -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.SignalRService/webPubSub/Webpubsub1/sharedPrivateLinkResources/resource1

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tombuildsstuff, I will make resourceGroups as camel cased, however, for webPubSub oe, the service is returning the value as WebPubSub and this behavior is the same as its parent WebPubSub resource. Shall we keep it as capital cased?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should be correcting it to the proper case

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package validate

// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten

import (
"fmt"

"github.com/hashicorp/terraform-provider-azurerm/internal/services/signalr/parse"
)

func WebPubsubSharedPrivateLinkResourceID(input interface{}, key string) (warnings []string, errors []error) {
v, ok := input.(string)
if !ok {
errors = append(errors, fmt.Errorf("expected %q to be a string", key))
return
}

if _, err := parse.WebPubsubSharedPrivateLinkResourceID(v); err != nil {
errors = append(errors, err)
}

return
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package validate

// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten

import "testing"

func TestWebPubsubSharedPrivateLinkResourceID(t *testing.T) {
cases := []struct {
Input string
Valid bool
}{

{
// empty
Input: "",
Valid: false,
},

{
// missing SubscriptionId
Input: "/",
Valid: false,
},

{
// missing value for SubscriptionId
Input: "/subscriptions/",
Valid: false,
},

{
// missing ResourceGroup
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/",
Valid: false,
},

{
// missing value for ResourceGroup
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/",
Valid: false,
},

{
// missing WebPubSubName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/",
Valid: false,
},

{
// missing value for WebPubSubName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/",
Valid: false,
},

{
// missing SharedPrivateLinkResourceName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/",
Valid: false,
},

{
// missing value for SharedPrivateLinkResourceName
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/sharedPrivateLinkResources/",
Valid: false,
},

{
// valid
Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourcegroups/resGroup1/providers/Microsoft.SignalRService/WebPubSub/Webpubsub1/sharedPrivateLinkResources/resource1",
Valid: true,
},

{
// upper-cased
Input: "/SUBSCRIPTIONS/12345678-1234-9876-4563-123456789012/RESOURCEGROUPS/RESGROUP1/PROVIDERS/MICROSOFT.SIGNALRSERVICE/WEBPUBSUB/WEBPUBSUB1/SHAREDPRIVATELINKRESOURCES/RESOURCE1",
Valid: false,
},
}
for _, tc := range cases {
t.Logf("[DEBUG] Testing Value %s", tc.Input)
_, errors := WebPubsubSharedPrivateLinkResourceID(tc.Input, "test")
valid := len(errors) == 0

if tc.Valid != valid {
t.Fatalf("Expected %t but got %t", tc.Valid, valid)
}
}
}
Loading