Skip to content

Commit 50bb45e

Browse files
New resource - azurerm_servicebus_namespace_network_rule_set (#6379)
Introduces new resource azurerm_servicebus_namespace_network_rule_set Fixes #3930
1 parent 11db030 commit 50bb45e

13 files changed

+987
-15
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package parse
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
7+
)
8+
9+
type ServiceBusNamespaceId struct {
10+
Name string
11+
ResourceGroup string
12+
}
13+
14+
func ServiceBusNamespaceID(input string) (*ServiceBusNamespaceId, error) {
15+
id, err := azure.ParseAzureResourceID(input)
16+
if err != nil {
17+
return nil, fmt.Errorf("unable to parse Service Bus Namespace ID %q: %+v", input, err)
18+
}
19+
20+
namespace := ServiceBusNamespaceId{
21+
ResourceGroup: id.ResourceGroup,
22+
}
23+
24+
if namespace.Name, err = id.PopSegment("namespaces"); err != nil {
25+
return nil, fmt.Errorf("unable to parse Service Bus Namespace ID %q: %+v", input, err)
26+
}
27+
28+
if err := id.ValidateNoEmptySegments(input); err != nil {
29+
return nil, fmt.Errorf("unable to parse Service Bus Namespace ID %q: %+v", input, err)
30+
}
31+
32+
return &namespace, nil
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package parse
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
7+
)
8+
9+
type ServiceBusNamespaceNetworkRuleSetId struct {
10+
Name string
11+
NamespaceName string
12+
ResourceGroup string
13+
}
14+
15+
func ServiceBusNamespaceNetworkRuleSetID(input string) (*ServiceBusNamespaceNetworkRuleSetId, error) {
16+
id, err := azure.ParseAzureResourceID(input)
17+
if err != nil {
18+
return nil, fmt.Errorf("unable to parse Service Bus Namespace Network Rule Set ID %q: %+v", input, err)
19+
}
20+
21+
rule := ServiceBusNamespaceNetworkRuleSetId{
22+
ResourceGroup: id.ResourceGroup,
23+
}
24+
25+
if rule.Name, err = id.PopSegment("networkrulesets"); err != nil {
26+
return nil, fmt.Errorf("unable to parse Service Bus Namespace Network Rule Set ID %q: %+v", input, err)
27+
}
28+
29+
if rule.NamespaceName, err = id.PopSegment("namespaces"); err != nil {
30+
return nil, fmt.Errorf("unable to parse Service Bus Namespace Network Rule Set ID %q: %+v", input, err)
31+
}
32+
33+
if err := id.ValidateNoEmptySegments(input); err != nil {
34+
return nil, fmt.Errorf("unable to parse Service Bus Namespace Network Rule Set ID %q: %+v", input, err)
35+
}
36+
37+
return &rule, nil
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package parse
2+
3+
import "testing"
4+
5+
func TestServiceBusNamespaceNetworkRuleID(t *testing.T) {
6+
testData := []struct {
7+
Name string
8+
Input string
9+
Error bool
10+
Expected *ServiceBusNamespaceNetworkRuleSetId
11+
}{
12+
{
13+
Name: "Empty",
14+
Input: "",
15+
Error: true,
16+
},
17+
{
18+
Name: "No Resource Groups Segment",
19+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000",
20+
Error: true,
21+
},
22+
{
23+
Name: "No Resource Groups Value",
24+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/",
25+
Error: true,
26+
},
27+
{
28+
Name: "Resource Group ID",
29+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/",
30+
Error: true,
31+
},
32+
{
33+
Name: "Missing Service Bus Namespace Name",
34+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/namespaces/",
35+
Error: true,
36+
},
37+
{
38+
Name: "Service Bus Namespace ID",
39+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/namespaces/namespace1",
40+
Error: true,
41+
},
42+
{
43+
Name: "Missing Network Rule Name",
44+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/namespaces/namespace1/networkrulesets/",
45+
Error: true,
46+
},
47+
{
48+
Name: "Service Bus Namespace Network Rule ID",
49+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/namespaces/namespace1/networkrulesets/default",
50+
Expected: &ServiceBusNamespaceNetworkRuleSetId{
51+
Name: "default",
52+
NamespaceName: "namespace1",
53+
ResourceGroup: "resGroup1",
54+
},
55+
},
56+
{
57+
Name: "Wrong casing",
58+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/Namespaces/namespace1",
59+
Error: true,
60+
},
61+
}
62+
63+
for _, v := range testData {
64+
t.Logf("[DEBUG] Testing %q", v.Name)
65+
66+
actual, err := ServiceBusNamespaceNetworkRuleSetID(v.Input)
67+
if err != nil {
68+
if v.Error {
69+
continue
70+
}
71+
72+
t.Fatalf("Expected a value but got an error: %s", err)
73+
}
74+
75+
if actual.Name != v.Expected.Name {
76+
t.Fatalf("Expected %q but got %q for Name", v.Expected.Name, actual.Name)
77+
}
78+
79+
if actual.NamespaceName != v.Expected.NamespaceName {
80+
t.Fatalf("Expected %q but got %q for Name", v.Expected.NamespaceName, actual.NamespaceName)
81+
}
82+
83+
if actual.ResourceGroup != v.Expected.ResourceGroup {
84+
t.Fatalf("Expected %q but got %q for Resource Group", v.Expected.ResourceGroup, actual.ResourceGroup)
85+
}
86+
}
87+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package parse
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestServiceBusNamespaceID(t *testing.T) {
8+
testData := []struct {
9+
Name string
10+
Input string
11+
Error bool
12+
Expected *ServiceBusNamespaceId
13+
}{
14+
{
15+
Name: "Empty",
16+
Input: "",
17+
Error: true,
18+
},
19+
{
20+
Name: "No Resource Groups Segment",
21+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000",
22+
Error: true,
23+
},
24+
{
25+
Name: "No Resource Groups Value",
26+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/",
27+
Error: true,
28+
},
29+
{
30+
Name: "Resource Group ID",
31+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/",
32+
Error: true,
33+
},
34+
{
35+
Name: "Missing Service Bus Namespace Name",
36+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/namespaces/",
37+
Error: true,
38+
},
39+
{
40+
Name: "Service Bus Namespace ID",
41+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/namespaces/namespace1",
42+
Expected: &ServiceBusNamespaceId{
43+
ResourceGroup: "resGroup1",
44+
Name: "namespace1",
45+
},
46+
},
47+
{
48+
Name: "Wrong casing",
49+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.ServiceBus/Namespaces/namespace1",
50+
Error: true,
51+
},
52+
}
53+
54+
for _, v := range testData {
55+
t.Logf("[DEBUG] Testing %q", v.Name)
56+
57+
actual, err := ServiceBusNamespaceID(v.Input)
58+
if err != nil {
59+
if v.Error {
60+
continue
61+
}
62+
63+
t.Fatalf("Expected a value but got an error: %s", err)
64+
}
65+
66+
if actual.Name != v.Expected.Name {
67+
t.Fatalf("Expected %q but got %q for Name", v.Expected.Name, actual.Name)
68+
}
69+
70+
if actual.ResourceGroup != v.Expected.ResourceGroup {
71+
t.Fatalf("Expected %q but got %q for Resource Group", v.Expected.ResourceGroup, actual.ResourceGroup)
72+
}
73+
}
74+
}

azurerm/internal/services/servicebus/registration.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ func (r Registration) SupportedDataSources() map[string]*schema.Resource {
3131
// SupportedResources returns the supported Resources supported by this Service
3232
func (r Registration) SupportedResources() map[string]*schema.Resource {
3333
return map[string]*schema.Resource{
34-
"azurerm_servicebus_namespace_authorization_rule": resourceArmServiceBusNamespaceAuthorizationRule(),
3534
"azurerm_servicebus_namespace": resourceArmServiceBusNamespace(),
36-
"azurerm_servicebus_queue_authorization_rule": resourceArmServiceBusQueueAuthorizationRule(),
35+
"azurerm_servicebus_namespace_authorization_rule": resourceArmServiceBusNamespaceAuthorizationRule(),
36+
"azurerm_servicebus_namespace_network_rule_set": resourceServiceBusNamespaceNetworkRuleSet(),
3737
"azurerm_servicebus_queue": resourceArmServiceBusQueue(),
38-
"azurerm_servicebus_subscription_rule": resourceArmServiceBusSubscriptionRule(),
38+
"azurerm_servicebus_queue_authorization_rule": resourceArmServiceBusQueueAuthorizationRule(),
3939
"azurerm_servicebus_subscription": resourceArmServiceBusSubscription(),
40+
"azurerm_servicebus_subscription_rule": resourceArmServiceBusSubscriptionRule(),
4041
"azurerm_servicebus_topic_authorization_rule": resourceArmServiceBusTopicAuthorizationRule(),
4142
"azurerm_servicebus_topic": resourceArmServiceBusTopic(),
4243
}

azurerm/internal/services/servicebus/resource_arm_servicebus_namespace.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package servicebus
33
import (
44
"fmt"
55
"log"
6-
"regexp"
76
"strings"
87
"time"
98

@@ -16,7 +15,10 @@ import (
1615
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
1716
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
1817
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/features"
18+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/servicebus/parse"
19+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/servicebus/validate"
1920
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags"
21+
azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema"
2022
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
2123
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
2224
)
@@ -32,9 +34,10 @@ func resourceArmServiceBusNamespace() *schema.Resource {
3234
Update: resourceArmServiceBusNamespaceCreateUpdate,
3335
Delete: resourceArmServiceBusNamespaceDelete,
3436

35-
Importer: &schema.ResourceImporter{
36-
State: schema.ImportStatePassthrough,
37-
},
37+
Importer: azSchema.ValidateResourceIDPriorToImport(func(id string) error {
38+
_, err := parse.ServiceBusNamespaceID(id)
39+
return err
40+
}),
3841

3942
MigrateState: ResourceAzureRMServiceBusNamespaceMigrateState,
4043
SchemaVersion: 1,
@@ -48,13 +51,10 @@ func resourceArmServiceBusNamespace() *schema.Resource {
4851

4952
Schema: map[string]*schema.Schema{
5053
"name": {
51-
Type: schema.TypeString,
52-
Required: true,
53-
ForceNew: true,
54-
ValidateFunc: validation.StringMatch(
55-
regexp.MustCompile("^[a-zA-Z][-a-zA-Z0-9]{0,100}[a-zA-Z0-9]$"),
56-
"The namespace can contain only letters, numbers, and hyphens. The namespace must start with a letter, and it must end with a letter or number.",
57-
),
54+
Type: schema.TypeString,
55+
Required: true,
56+
ForceNew: true,
57+
ValidateFunc: validate.ServiceBusNamespaceName,
5858
},
5959

6060
"location": azure.SchemaLocation(),

0 commit comments

Comments
 (0)