From dca7b3041e91e21dbb1e19fe3e8d1adc5c3af9e2 Mon Sep 17 00:00:00 2001 From: Heng Lu Date: Fri, 28 Feb 2025 14:40:26 +0800 Subject: [PATCH] bugfix: format azurerm resource ID when move resource --- CHANGELOG.md | 1 + internal/services/azapi_resource.go | 9 +++- .../services/parse/azurerm_resource_id.go | 23 ++++++++++ .../parse/azurerm_resource_id_test.go | 45 +++++++++++++++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 internal/services/parse/azurerm_resource_id.go create mode 100644 internal/services/parse/azurerm_resource_id_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index a3e567cc4..85980137c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ENHANCEMENTS: BUG FIXES: - Fix a bug that query parameters and headers don't work properly with unknown values - Fix more edge cases that the provider produced inconsistent result after apply when default output feature is enabled. +- Fix a bug that when moving resource from `azurerm` resource, the id could not be parsed correctly. ## v2.2.0 diff --git a/internal/services/azapi_resource.go b/internal/services/azapi_resource.go index d6bae3f39..5fd0220b9 100644 --- a/internal/services/azapi_resource.go +++ b/internal/services/azapi_resource.go @@ -1094,12 +1094,19 @@ func (r *AzapiResource) MoveState(ctx context.Context) []resource.StateMover { response.Diagnostics.AddError("Invalid source state", "The source state does not contain an id") return } - id, err := parse.ResourceID(requestID) + + azureId, err := parse.AzurermIdToAzureId(request.SourceTypeName, requestID) if err != nil { response.Diagnostics.AddError("Invalid Resource ID", fmt.Errorf("parsing Resource ID %q: %+v", requestID, err).Error()) return } + id, err := parse.ResourceID(azureId) + if err != nil { + response.Diagnostics.AddError("Invalid Resource ID", fmt.Errorf("parsing Resource ID %q: %+v", azureId, err).Error()) + return + } + state := r.defaultAzapiResourceModel() state.ID = types.StringValue(id.ID()) state.Name = types.StringValue(id.Name) diff --git a/internal/services/parse/azurerm_resource_id.go b/internal/services/parse/azurerm_resource_id.go new file mode 100644 index 000000000..d01f88646 --- /dev/null +++ b/internal/services/parse/azurerm_resource_id.go @@ -0,0 +1,23 @@ +package parse + +import ( + "fmt" + "strings" +) + +// AzurermIdToAzureId converts an azurerm id to an azure resource id +func AzurermIdToAzureId(azurermResourceType string, azurermId string) (string, error) { + switch azurermResourceType { + case "azurerm_monitor_diagnostic_setting": + // input: | + // output: /providers/Microsoft.Insights/diagnosticSettings/ + azurermIdSplit := strings.Split(azurermId, "|") + if len(azurermIdSplit) != 2 { + return "", fmt.Errorf("invalid id: %s, expected format: |", azurermId) + } + return fmt.Sprintf("%s/providers/Microsoft.Insights/diagnosticSettings/%s", azurermIdSplit[0], azurermIdSplit[1]), nil + // add more cases here as needed + } + // return azure id + return azurermId, nil +} diff --git a/internal/services/parse/azurerm_resource_id_test.go b/internal/services/parse/azurerm_resource_id_test.go new file mode 100644 index 000000000..326520f7f --- /dev/null +++ b/internal/services/parse/azurerm_resource_id_test.go @@ -0,0 +1,45 @@ +package parse_test + +import ( + "testing" + + "github.com/Azure/terraform-provider-azapi/internal/services/parse" +) + +func Test_AzurermIdToAzureId(t *testing.T) { + testcases := []struct { + name string + azurermResourceType string + azurermId string + expectedAzureId string + expectError bool + }{ + { + name: "azurerm_monitor_diagnostic_setting valid", + azurermResourceType: "azurerm_monitor_diagnostic_setting", + azurermId: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/vm|diagnosticSettingName", + expectedAzureId: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/vm/providers/Microsoft.Insights/diagnosticSettings/diagnosticSettingName", + expectError: false, + }, + { + name: "azurerm_monitor_diagnostic_setting invalid", + azurermResourceType: "azurerm_monitor_diagnostic_setting", + azurermId: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/vm|diagnosticSettingName|foo", + expectedAzureId: "", + expectError: true, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + azureId, err := parse.AzurermIdToAzureId(tc.azurermResourceType, tc.azurermId) + if (err != nil) != tc.expectError { + t.Fatalf("expected error: %v, got: %v", tc.expectError, err) + } + if azureId != tc.expectedAzureId { + t.Fatalf("expected azure id: %s, got: %s", tc.expectedAzureId, azureId) + } + }) + } + +}