From bd81f4b636566f69227a7da2cb910af3b90ca99d Mon Sep 17 00:00:00 2001 From: Stephen Jennings Date: Mon, 9 Jan 2023 11:18:42 -0800 Subject: [PATCH] resource `azurerm_storage_queue` - add `resource_manager_id` --- .../parse/storage_queue_resource_manager.go | 81 ++++++++++ .../storage_queue_resource_manager_test.go | 144 ++++++++++++++++++ internal/services/storage/resourceids.go | 1 + .../storage/storage_queue_resource.go | 9 ++ .../storage_queue_resource_manager_id.go | 23 +++ .../storage_queue_resource_manager_id_test.go | 100 ++++++++++++ 6 files changed, 358 insertions(+) create mode 100644 internal/services/storage/parse/storage_queue_resource_manager.go create mode 100644 internal/services/storage/parse/storage_queue_resource_manager_test.go create mode 100644 internal/services/storage/validate/storage_queue_resource_manager_id.go create mode 100644 internal/services/storage/validate/storage_queue_resource_manager_id_test.go diff --git a/internal/services/storage/parse/storage_queue_resource_manager.go b/internal/services/storage/parse/storage_queue_resource_manager.go new file mode 100644 index 000000000000..2c15d17606f1 --- /dev/null +++ b/internal/services/storage/parse/storage_queue_resource_manager.go @@ -0,0 +1,81 @@ +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 StorageQueueResourceManagerId struct { + SubscriptionId string + ResourceGroup string + StorageAccountName string + QueueServiceName string + QueueName string +} + +func NewStorageQueueResourceManagerID(subscriptionId, resourceGroup, storageAccountName, queueServiceName, queueName string) StorageQueueResourceManagerId { + return StorageQueueResourceManagerId{ + SubscriptionId: subscriptionId, + ResourceGroup: resourceGroup, + StorageAccountName: storageAccountName, + QueueServiceName: queueServiceName, + QueueName: queueName, + } +} + +func (id StorageQueueResourceManagerId) String() string { + segments := []string{ + fmt.Sprintf("Queue Name %q", id.QueueName), + fmt.Sprintf("Queue Service Name %q", id.QueueServiceName), + fmt.Sprintf("Storage Account Name %q", id.StorageAccountName), + fmt.Sprintf("Resource Group %q", id.ResourceGroup), + } + segmentsStr := strings.Join(segments, " / ") + return fmt.Sprintf("%s: (%s)", "Storage Queue Resource Manager", segmentsStr) +} + +func (id StorageQueueResourceManagerId) ID() string { + fmtString := "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Storage/storageAccounts/%s/queueServices/%s/queues/%s" + return fmt.Sprintf(fmtString, id.SubscriptionId, id.ResourceGroup, id.StorageAccountName, id.QueueServiceName, id.QueueName) +} + +// StorageQueueResourceManagerID parses a StorageQueueResourceManager ID into an StorageQueueResourceManagerId struct +func StorageQueueResourceManagerID(input string) (*StorageQueueResourceManagerId, error) { + id, err := resourceids.ParseAzureResourceID(input) + if err != nil { + return nil, err + } + + resourceId := StorageQueueResourceManagerId{ + 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.StorageAccountName, err = id.PopSegment("storageAccounts"); err != nil { + return nil, err + } + if resourceId.QueueServiceName, err = id.PopSegment("queueServices"); err != nil { + return nil, err + } + if resourceId.QueueName, err = id.PopSegment("queues"); err != nil { + return nil, err + } + + if err := id.ValidateNoEmptySegments(input); err != nil { + return nil, err + } + + return &resourceId, nil +} diff --git a/internal/services/storage/parse/storage_queue_resource_manager_test.go b/internal/services/storage/parse/storage_queue_resource_manager_test.go new file mode 100644 index 000000000000..c2ff2184c22e --- /dev/null +++ b/internal/services/storage/parse/storage_queue_resource_manager_test.go @@ -0,0 +1,144 @@ +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 = StorageQueueResourceManagerId{} + +func TestStorageQueueResourceManagerIDFormatter(t *testing.T) { + actual := NewStorageQueueResourceManagerID("12345678-1234-9876-4563-123456789012", "resGroup1", "storageAccount1", "default", "queue1").ID() + expected := "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/queues/queue1" + if actual != expected { + t.Fatalf("Expected %q but got %q", expected, actual) + } +} + +func TestStorageQueueResourceManagerID(t *testing.T) { + testData := []struct { + Input string + Error bool + Expected *StorageQueueResourceManagerId + }{ + + { + // 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 StorageAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/", + Error: true, + }, + + { + // missing value for StorageAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/", + Error: true, + }, + + { + // missing QueueServiceName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/", + Error: true, + }, + + { + // missing value for QueueServiceName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/", + Error: true, + }, + + { + // missing QueueName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/", + Error: true, + }, + + { + // missing value for QueueName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/queues/", + Error: true, + }, + + { + // valid + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/queues/queue1", + Expected: &StorageQueueResourceManagerId{ + SubscriptionId: "12345678-1234-9876-4563-123456789012", + ResourceGroup: "resGroup1", + StorageAccountName: "storageAccount1", + QueueServiceName: "default", + QueueName: "queue1", + }, + }, + + { + // upper-cased + Input: "/SUBSCRIPTIONS/12345678-1234-9876-4563-123456789012/RESOURCEGROUPS/RESGROUP1/PROVIDERS/MICROSOFT.STORAGE/STORAGEACCOUNTS/STORAGEACCOUNT1/QUEUESERVICES/DEFAULT/QUEUES/QUEUE1", + Error: true, + }, + } + + for _, v := range testData { + t.Logf("[DEBUG] Testing %q", v.Input) + + actual, err := StorageQueueResourceManagerID(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.StorageAccountName != v.Expected.StorageAccountName { + t.Fatalf("Expected %q but got %q for StorageAccountName", v.Expected.StorageAccountName, actual.StorageAccountName) + } + if actual.QueueServiceName != v.Expected.QueueServiceName { + t.Fatalf("Expected %q but got %q for QueueServiceName", v.Expected.QueueServiceName, actual.QueueServiceName) + } + if actual.QueueName != v.Expected.QueueName { + t.Fatalf("Expected %q but got %q for QueueName", v.Expected.QueueName, actual.QueueName) + } + } +} diff --git a/internal/services/storage/resourceids.go b/internal/services/storage/resourceids.go index 3a93cf5035c7..2e2a9bb0ee2b 100644 --- a/internal/services/storage/resourceids.go +++ b/internal/services/storage/resourceids.go @@ -5,6 +5,7 @@ package storage //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=StorageAccount -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=StorageAccountDefaultBlob -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/blobServices/default //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=StorageContainerResourceManager -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/blobServices/default/containers/container1 +//go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=StorageQueueResourceManager -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/queues/queue1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=StorageShareResourceManager -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/fileServices/fileService1/fileshares/share1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=StorageSyncGroup -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.StorageSync/storageSyncServices/storageSyncService1/syncGroups/syncGroup1 //go:generate go run ../../tools/generator-resource-id/main.go -path=./ -name=StorageSyncService -id=/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.StorageSync/storageSyncServices/storageSyncService1 diff --git a/internal/services/storage/storage_queue_resource.go b/internal/services/storage/storage_queue_resource.go index a8b3ecdba696..a1ff4b07a498 100644 --- a/internal/services/storage/storage_queue_resource.go +++ b/internal/services/storage/storage_queue_resource.go @@ -54,6 +54,11 @@ func resourceStorageQueue() *pluginsdk.Resource { }, "metadata": MetaDataSchema(), + + "resource_manager_id": { + Type: pluginsdk.TypeString, + Computed: true, + }, }, } } @@ -135,6 +140,7 @@ func resourceStorageQueueUpdate(d *pluginsdk.ResourceData, meta interface{}) err func resourceStorageQueueRead(d *pluginsdk.ResourceData, meta interface{}) error { storageClient := meta.(*clients.Client).Storage + subscriptionId := meta.(*clients.Client).Account.SubscriptionId ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() @@ -175,6 +181,9 @@ func resourceStorageQueueRead(d *pluginsdk.ResourceData, meta interface{}) error return fmt.Errorf("setting `metadata`: %s", err) } + resourceManagerId := parse.NewStorageQueueResourceManagerID(subscriptionId, account.ResourceGroup, id.AccountName, "default", id.Name) + d.Set("resource_manager_id", resourceManagerId.ID()) + return nil } diff --git a/internal/services/storage/validate/storage_queue_resource_manager_id.go b/internal/services/storage/validate/storage_queue_resource_manager_id.go new file mode 100644 index 000000000000..690c67c2b55f --- /dev/null +++ b/internal/services/storage/validate/storage_queue_resource_manager_id.go @@ -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/storage/parse" +) + +func StorageQueueResourceManagerID(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.StorageQueueResourceManagerID(v); err != nil { + errors = append(errors, err) + } + + return +} diff --git a/internal/services/storage/validate/storage_queue_resource_manager_id_test.go b/internal/services/storage/validate/storage_queue_resource_manager_id_test.go new file mode 100644 index 000000000000..15266d845908 --- /dev/null +++ b/internal/services/storage/validate/storage_queue_resource_manager_id_test.go @@ -0,0 +1,100 @@ +package validate + +// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten + +import "testing" + +func TestStorageQueueResourceManagerID(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 StorageAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/", + Valid: false, + }, + + { + // missing value for StorageAccountName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/", + Valid: false, + }, + + { + // missing QueueServiceName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/", + Valid: false, + }, + + { + // missing value for QueueServiceName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/", + Valid: false, + }, + + { + // missing QueueName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/", + Valid: false, + }, + + { + // missing value for QueueName + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/queues/", + Valid: false, + }, + + { + // valid + Input: "/subscriptions/12345678-1234-9876-4563-123456789012/resourceGroups/resGroup1/providers/Microsoft.Storage/storageAccounts/storageAccount1/queueServices/default/queues/queue1", + Valid: true, + }, + + { + // upper-cased + Input: "/SUBSCRIPTIONS/12345678-1234-9876-4563-123456789012/RESOURCEGROUPS/RESGROUP1/PROVIDERS/MICROSOFT.STORAGE/STORAGEACCOUNTS/STORAGEACCOUNT1/QUEUESERVICES/DEFAULT/QUEUES/QUEUE1", + Valid: false, + }, + } + for _, tc := range cases { + t.Logf("[DEBUG] Testing Value %s", tc.Input) + _, errors := StorageQueueResourceManagerID(tc.Input, "test") + valid := len(errors) == 0 + + if tc.Valid != valid { + t.Fatalf("Expected %t but got %t", tc.Valid, valid) + } + } +}