From c4449a239ebb250646d01c3b6427aff7b5861cb4 Mon Sep 17 00:00:00 2001 From: Julien Duchesne Date: Fri, 14 Jun 2024 08:29:33 -0400 Subject: [PATCH] (V2 Backport) Alerting Rule Group: Support colon in title (#1643) Backport of https://github.com/grafana/terraform-provider-grafana/pull/1625 --- internal/common/resource.go | 2 +- internal/common/resource_id.go | 10 ++++---- .../grafana/resource_alerting_rule_group.go | 23 ++++++++++++------- .../resource_alerting_rule_group_test.go | 2 +- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/internal/common/resource.go b/internal/common/resource.go index 8b73b6598..ddb9dc24a 100644 --- a/internal/common/resource.go +++ b/internal/common/resource.go @@ -53,7 +53,7 @@ func (r *Resource) ImportExample() string { fieldTemplates[i] = fmt.Sprintf("{{ %s }}", fields[i].Name) } return fmt.Sprintf(`terraform import %s.name %q -`, r.Name, strings.Join(fieldTemplates, defaultSeparator)) +`, r.Name, strings.Join(fieldTemplates, ResourceIDSeparator)) } id := r.IDType diff --git a/internal/common/resource_id.go b/internal/common/resource_id.go index 57de775ab..0993b7f9e 100644 --- a/internal/common/resource_id.go +++ b/internal/common/resource_id.go @@ -10,7 +10,7 @@ import ( type ResourceIDFieldType string const ( - defaultSeparator = ":" + ResourceIDSeparator = ":" ResourceIDFieldTypeInt = ResourceIDFieldType("int") ResourceIDFieldTypeString = ResourceIDFieldType("string") ) @@ -71,14 +71,14 @@ func (id *ResourceID) RequiredFields() []ResourceIDField { } func NewResourceID(expectedFields ...ResourceIDField) *ResourceID { - return newResourceIDWithSeparators([]string{defaultSeparator}, expectedFields...) + return newResourceIDWithSeparators([]string{ResourceIDSeparator}, expectedFields...) } // Deprecated: Use NewResourceID instead // We should standardize on a single separator, so that function should only be used for old resources // On major versions, switch to NewResourceID and remove uses of this function func NewResourceIDWithLegacySeparator(legacySeparator string, expectedFields ...ResourceIDField) *ResourceID { - return newResourceIDWithSeparators([]string{defaultSeparator, legacySeparator}, expectedFields...) + return newResourceIDWithSeparators([]string{ResourceIDSeparator, legacySeparator}, expectedFields...) } func newResourceIDWithSeparators(separators []string, expectedFields ...ResourceIDField) *ResourceID { @@ -118,7 +118,7 @@ func (id *ResourceID) Make(parts ...any) string { } } - return strings.Join(stringParts, defaultSeparator) + return strings.Join(stringParts, ResourceIDSeparator) } // Single parses a resource ID into a single value @@ -181,5 +181,5 @@ func split(resourceID string, expectedFields []ResourceIDField, separators []str for i, f := range expectedFields { expectedFieldNames[i] = f.Name } - return nil, fmt.Errorf("id %q does not match expected format. Should be in the format: %s", resourceID, strings.Join(expectedFieldNames, defaultSeparator)) + return nil, fmt.Errorf("id %q does not match expected format. Should be in the format: %s", resourceID, strings.Join(expectedFieldNames, ResourceIDSeparator)) } diff --git a/internal/resources/grafana/resource_alerting_rule_group.go b/internal/resources/grafana/resource_alerting_rule_group.go index c81ceb64c..794a72205 100644 --- a/internal/resources/grafana/resource_alerting_rule_group.go +++ b/internal/resources/grafana/resource_alerting_rule_group.go @@ -286,11 +286,14 @@ func listRuleGroups(ctx context.Context, client *goapi.GrafanaHTTPAPI, data *Lis func readAlertRuleGroup(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics { client, orgID, idWithoutOrg := OAPIClientFromExistingOrgResource(meta, data.Id()) - split, err := resourceRuleGroupID.Split(idWithoutOrg) - if err != nil { - return diag.FromErr(err) + folderUID, title, found := strings.Cut(idWithoutOrg, common.ResourceIDSeparator) + if !found { + split, err := resourceRuleGroupID.Split(idWithoutOrg) + if err != nil { + return diag.FromErr(err) + } + folderUID, title = split[0].(string), split[1].(string) } - folderUID, title := split[0].(string), split[1].(string) resp, err := client.Provisioning.GetAlertRuleGroup(title, folderUID) if err, shouldReturn := common.CheckReadError("rule group", data, err); shouldReturn { @@ -385,11 +388,15 @@ func putAlertRuleGroup(ctx context.Context, data *schema.ResourceData, meta inte func deleteAlertRuleGroup(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics { client, _, idWithoutOrg := OAPIClientFromExistingOrgResource(meta, data.Id()) - split, err := resourceRuleGroupID.Split(idWithoutOrg) - if err != nil { - return diag.FromErr(err) + folderUID, title, found := strings.Cut(idWithoutOrg, common.ResourceIDSeparator) + if !found { + split, err := resourceRuleGroupID.Split(idWithoutOrg) + if err != nil { + return diag.FromErr(err) + } + folderUID, title = split[0].(string), split[1].(string) } - folderUID, title := split[0].(string), split[1].(string) + // TODO use DeleteAlertRuleGroup method instead (available since Grafana 11) resp, err := client.Provisioning.GetAlertRuleGroup(title, folderUID) if err != nil { diff --git a/internal/resources/grafana/resource_alerting_rule_group_test.go b/internal/resources/grafana/resource_alerting_rule_group_test.go index f4e97b3e4..6ac18d939 100644 --- a/internal/resources/grafana/resource_alerting_rule_group_test.go +++ b/internal/resources/grafana/resource_alerting_rule_group_test.go @@ -271,7 +271,7 @@ func TestAccAlertRule_inOrg(t *testing.T) { var group models.AlertRuleGroup var org models.OrgDetailsDTO - name := acctest.RandString(10) + name := "test:" + acctest.RandString(10) resource.ParallelTest(t, resource.TestCase{ ProtoV5ProviderFactories: testutils.ProtoV5ProviderFactories,